标签:
▲__slots__
当定义一个class并创建了一个class的实例之后,我们可以给该实例绑定任何属性和方法。这就是动态语言的灵活性。
实例代码如下:
#定义一个类Student >>> class Student(object): ... pass ... #创建类Student的一个实例stu1 >>> stu1 = Student() #给实例绑定一个属性name >>> stu1.name = ‘michael‘ >>> stu1.name michael #给实例绑定一个属性age >>> stu1.age = ‘25‘ >>> stu1.age 25 #定义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.age 20 #创建类Student的另一个实例stu2 >>> stu2 = Student() #测试给stu1绑定的属性name和方法set_age()是否可用于stu2 >>> stu2.name Traceback (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.score 98 >>> stu2.set_score(70) >>> stu2.score 70
实际上,上述代码set_score()可以直接定义在类Student中,但是动态绑定也允许我们在程序运行的过程中,动态给程序加上功能。
如果我们想要限制动态增加的属性,我们可以再定义class的时候定义一个特殊的__slots__变量,来限制该class能添加的属性。
实例代码如下:
>>> class Student(object): #用tuple定义允许绑定的属性名称 ... __slots__ = (‘name‘, ‘age‘) ... >>> stu3 = Student() >>> stu3.name = ‘jack‘ >>> stu3.age = ‘22‘ #测试未绑定的属性score能否添加 >>> stu3.score = ‘86‘ Traceback (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._score stu1 = Student() print(‘-‘ * 50) stu1.score = 88 print(‘-‘ * 50) print(stu1.score) print(‘-‘ * 50) stu1.score = 92 print(stu1.score) del stu1.score
执行结果:
-------------------------------------------------- you set the score! -------------------------------------------------- you get the score! 88 -------------------------------------------------- you set the score! you get the score! 92 you delete the score!
▲多重继承
在设计类的继承关系时,通常主线都是单一继承下来的。如果需要加入额外的功能,可以通过多重继承来实现。这种设计通常称为Mixin。
示例代码如下:
class Animal(object): pass class Flyable(object): def fly(self): print(‘flying...‘) #定义一个多重继承的子类 class Eagle(Animal, Flyable): pass
标签:
原文地址:http://www.cnblogs.com/wddoer/p/4261035.html