居于动态语言的灵活性,咱们知道能够动态的给实例绑定属性,那是否能够给实例绑定一个方法,成为实例方法。
例如:测试
class Student(object): pass >>>s = Student() >>>s.name = 'xlp' # 动态语言的灵活性:动态给实例绑定一个属性 def set_age(self,age) # 定义一个外部方法:set_age(),不是class里的 self.age = age
能够建立一个连接把外部的set_age()方法连接到Student内。
具体作法是:经过MethodType
给类一个实例绑定外部方法。code
from types import MethodType # ##???? s.set_age = MethodType (set_age,s) # 给实例绑定一个方法 s.set_age(24) # 调用实例方法 s.age #测试结果 24
可是该方法对除开实例s,对其余实例是不起做用的。
例如:ast
s2 = Student() # 建立新的实例 s2.set_age(25) # 尝试调用该方法 # 报错 #Traceback (most recent call last): # File "<stdin>", line 1, in <module> #AttributeError: 'Student' object has no attribute 'set_age'
若要给类的全部实例绑定外部方法,则须要给类动态绑定该方法。class
>>>def set_score(self,score): self.score = score >>>Student.set_score = set_score # 直接用类来建立一个方法 >>> s.set_score(100) >>> s.score 100 >>> s2.set_score(59) >>> s2.score 59
此时实例和类都指向同一个set_score()。import
一般,上面的set_score()方法通常直接定义在class中,但动态绑定容许咱们在程序运行的过程当中动态地给class加上功能。module
❤ thanks for watching, keep on updating...
点个赞再走吧object