首页 > 代码库 > 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 = ‘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._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#面向对象高级编程一
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。