首页 > 代码库 > Python笔记6#面向对象高级编程一

Python笔记6#面向对象高级编程一

▲__slots__

当定义一个class并创建了一个class的实例之后,我们可以给该实例绑定任何属性和方法。这就是动态语言的灵活性。

实例代码如下:

#定义一个类Student>>> class Student(object):...     pass...#创建类Student的一个实例stu1>>> stu1 = Student()#给实例绑定一个属性name>>> stu1.name = michael>>> stu1.namemichael#给实例绑定一个属性age>>> stu1.age = 25>>> stu1.age25#定义set_age()函数作为实例方法>>> def set_age(self, age):...     self.age = age...#导入MethodType模块>>> from types import MethodType#给实例stu1绑定方法set_age()>>> stu1.set_age = MethodType(set_age, stu1)#调用实例方法>>> stu1.set_age(20)#测试结果>>> stu1.age20#创建类Student的另一个实例stu2>>> stu2 = Student()#测试给stu1绑定的属性name和方法set_age()是否可用于stu2>>> stu2.nameTraceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: Student object has no attribute name>>> stu2.set_age(22)Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: Student object has no attribute set_age#创建一个类方法,并绑定给类Student>>> def set_score(self, score):...     self.score = score...>>> Student.set_score = MethodType(set_score, Student)#测试绑定类Student的方法set_score()是否可用于stu1和stu2>>> stu1.set_score(98)>>> stu1.score98>>> stu2.set_score(70)>>> stu2.score70

实际上,上述代码set_score()可以直接定义在类Student中,但是动态绑定也允许我们在程序运行的过程中,动态给程序加上功能。

如果我们想要限制动态增加的属性,我们可以再定义class的时候定义一个特殊的__slots__变量,来限制该class能添加的属性。

实例代码如下:

>>> class Student(object):#用tuple定义允许绑定的属性名称...     __slots__ = (name, age)...>>> stu3 = Student()>>> stu3.name = jack>>> stu3.age = 22#测试未绑定的属性score能否添加>>> stu3.score = 86Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: Student object has no attribute score#测试__slots__对子类是否起作用>>> class Firstgrade(Student):...     pass...>>> stu4 = Firstgrade()>>> stu4.name = david>>> stu4.age = 12>>> stu4.score = 90

 

▲Property装饰器

官方文档地址链接:https://docs.python.org/3/library/functions.html?highlight=property#property

@property可以把一个方法变成属性调用。把一个getter方法编程属性,只需加上@property。@*.setter负责把一个setter方法变成属性赋值。

示例代码如下:

class Student(object):    def __init__(self):        self._score = None    #为属性score增加getter    @property    def score(self):        print(you get the score!)        return self._score    #为属性score增加setter    @score.setter    def score(self, value):        print(you set the score!)        self._score = value    #为属性score增加deleter    @score.deleter    def score(self):        print(you delete the score!)        del self._scorestu1 = Student()print(- * 50)stu1.score = 88print(- * 50)print(stu1.score)print(- * 50)stu1.score = 92print(stu1.score)del stu1.score

执行结果:

--------------------------------------------------you set the score!--------------------------------------------------you get the score!88--------------------------------------------------you set the score!you get the score!92you delete the score!

▲多重继承

在设计类的继承关系时,通常主线都是单一继承下来的。如果需要加入额外的功能,可以通过多重继承来实现。这种设计通常称为Mixin。

示例代码如下:

class Animal(object):    passclass Flyable(object):    def fly(self):        print(flying...)#定义一个多重继承的子类class Eagle(Animal, Flyable):    pass

Python笔记6#面向对象高级编程一