动态绑定方法 MethodType()
在动态语言中,有一种方法可以使类或者实例在没有方法或者没有想要的方法时,动态的加上一个方法。使用的就是 MethodType()
其使用方法是:
form types import MethodType
需要绑定的类或实例.需要被绑定的方法=MethodType(方法名,类名/属性名)
1.绑定方法到实例中
class Student (object): #先建立一个类
pass
def set_age(self,age): #一个即将被绑定的方法
self.age=age
s=Student() #创建一个实例
from types import MethodType
s.set_age=MethodType(set_age,s) #动态绑定方法:set_age到s
s.set_age=22 #使用动态绑定的方法
print(s.set_age) #输出22
s.set_age=MethodType(set_age,s)
s.set_age(23)
print(s.age) #输出23
2.绑定到类上
class Student (object): #先建立一个类
pass
def set_age(self,age): #一个即将被绑定的方法
self.age=age
from types import MethodType
Student.set_age=MethodType(set_age,Student)
Student.set_age=22
print(Student.set_age) #输出22
Student.set_age=MethodType(set_age,Student)
Student.set_age(23)
print(Student.age) #输出23
s1=Student()
s1.age #输出23
限制方法:__slots__
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
由于'score'
没有被放到__slots__
中,所以不能绑定score
属性,试图绑定score
将得到AttributeError
的错误。
使用__slots__
要注意,__slots__
定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
>>> class GraduateStudent(Student):
... pass
...
>>> g = GraduateStudent()
>>> g.score = 9999
除非在子类中也定义__slots__
,这样,子类实例允许定义的属性就是自身的__slots__
加上父类的__slots__
。
部分例子参考廖雪峰Python教程:链接: