1.slots
1.1.动态绑定属性或方法
class Student(object):
pass
s=Student()
s.name='Michael'#动态给实例绑定一个属性
print(s.name)
def set_age(self,age):
self.age=age
from types import MethodType#MethodType方法在Types模块里,要先import才能使用
s.set_age=MethodType(set_age,s)#给实例动态绑定一个方法
s.set_age(25)#调用实例方法
print(s.age)#测试结果
s2=Student()
#给s 实例绑定的方法,对另一个实例s2 不起作用的
try:
s2.set_age(36)
except AttributeError as e:
print('AttributeError',e)
#为了给所有实例都绑定方法,可以给class 绑定方法:
def set_score(self,score):
self.score=score
Student.set_score=set_score#给class Student 绑定方法
#给class 绑定的方法,所有实例均可调用
s.set_score(99)
print(s.score)
s2.set_score(88)
print(s2.score)
1.2.slots:限制class 实例能添加的属性
slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的;
如果在子类也定义slots,则子类中的可允许添加属性=子类的slots和父类的slots
class Student(object):
__slots__=('name','age')#用tuple定义允许实例绑定的属性名称
s=Student()
s.name='Michael'#动态给实例绑定一个属性name
s.age=25##动态给实例绑定一个属性age
print(s.name,s.age)
#由于score 没有放在__slots__中,所以不能动态绑定score 属性,会报错
try:
s.score=99
except AttributeError as e:
print('AttributeError',e)
# __slots__进对当前类实例起作用,对继承的子类不起作用
# 在子类中动态绑定score 是可以的
class GraduatesStudent(Student):
pass
g=GraduatesStudent()
g.score=88
print(g.score)
#子类也定义__slots__,则子类中的可允许添加属性=子类的__slots__和父类的__slots__
class SubStudent(Student):
__slots__=('gender')
sub=SubStudent()
sub.gender='male'
sub.name='TOM'
sub.age=33
print(sub.name,sub.age,sub.gender)
网友评论