Python 是动态语言,我们可以在定义类之后给类动态绑定属性和方法,也可以创建一个类的对象后, 动态给该对象绑定属性和方法,这就是动态语言的灵活性。
前面章节中我们已经学习过如何给类或对象动态的绑定属性和方法,本节我们学习使用 types 模块的 MethodType
对类的方法
进行动态绑定。
使用 types 模块的 MethodType 函数可以给类的某个对象动态绑定函数,但我们知道给类的某个对象动态绑定函数不会影响另一个对象。
from types import MethodType class Human(object): pass def printsex(self): print(u"女") ruhua = Human() zhaoritian = Human() ruhua.printsex = MethodType(printsex, ruhua) ruhua.printsex() # 调用绑定的 printsex 函数 zhaoritian.printsex() # 错误
如果我们想让动态绑定的函数作用于所有对象,可以直接对类进行动态绑定,比如直接对 Human 类进行动态绑定。
from types import MethodType class Human(object): pass def printsex(self): print(u"女") ruhua = Human() zhaoritian = Human() Human.printsex = MethodType(printsex, Human) ruhua.printsex() # 调用绑定的 printsex 函数 zhaoritian.printsex() # 调用绑定的 printsex 函数
会使用 types 的 MethodType 函数。
要知道 types 的 MethodType 函数没法给类或对象动态绑定属性。
想想为什么使用 types 的 MethodType 函数对对象进行动态绑定函数时,被绑定的函数需要 self 参数,而我们前面讲的直接给对象进行动态绑定函数不需要这个参数。
from types import MethodType class Human(object): pass def printsex(self): # 需要 self 参数 print(u"女") def printage(): # 不需要 self 参数 print(18) ruhua = Human() zhaoritian = Human() ruhua.printsex = MethodType(printsex, ruhua) ruhua.printsex() # 调用绑定的 printsex 函数 ruhua.printage = printage ruhua.printage() # 调用绑定的 printage 函数
谢谢大神,比核心编程上讲得易懂多啦