第8.29节 使用MethodType将Python __setattr__定义的实例方法与实例绑定

一、 引言
《第7.14节Python类中的实例方法解析》介绍了使用“实例对象名.方法名 = MethodType(函数, 对象)”将动态定义的方法与实例进行绑定
《第8.12节 Python类中使用__dict__定义实例变量和方法》介绍了使用

self.__dict__['drive'] = MethodType(fdrive,self)

将动态定义的方法与实例进行绑定
这些绑定了方法与实例对象的方法,通过“实例.方法”调用时就无需在第一个实参中手工传递self参数,与类体中直接定义的方法调用形式及处理机制相同。而上节介绍__setattr__定义实例方法却没有提供这样的介绍,实际上通过__setattr__一样也可以实现动态定义的实例方法与实例进行绑定。

二、 绑定语法

  1. 语法:实例.__setattr__(实例方法名,MethodType(绑定函数, 实例))
  2. 其中:
    1)“实例”就是类定义的实例对象;
    2)“实例方法名”就是需要动态定义的实例方法的名字;
    3)“绑定函数”就是实例方法真正实现的在类体外定义的函数。

三、 案例

  1. 案例说明
    本节案例就是上节案例的基础上增加了一个绑定动态增加的实例方法与实例对象的处理,具体例子情况如下:
    1)从types模块中导入MethodType方法;
    2)定义了函数fdrive,准备用于实例方法定义使用;
    3)定义Car类, 其构造方法中定义了power实例变量和 totaldistance实例变量,不过totaldistance是使用__setattr__方法定义的;
    4)类定义后定义了类的实例car,在类体外使用__setattr__方法将函数绑定到car的实例方法driver,绑定时使用了MethodType方法,这样调用时就无需象上节一样传递“实例”实参。而是Python自动添加“self”。
  2. 源代码
>>> from types import MethodType #导入MethodType方法
>>> def fdrive(self,distance):self.totaldistance += distance  #定义一个函数,准备用于赋值给类的实例方法属性

>>> class Car():
    def __init__(self, power):
        self.power = power
        self.__setattr__('totaldistance',0)
        
>>> car = Car('汽油发动机')
>>> car.__setattr__('drive',MethodType(fdrive,car))  #定义实例方法drive并和实例绑定
>>> car.drive(100)  #调用新绑定的实例方法,参数中没有传入实参car
>>> car.__dict__
{'power': '汽油发动机', 'totaldistance': 100, 'drive': <bound method fdrive of <__main__.Car object at 0x0000000003805898>>}
>>>
  1. 执行截屏
    在这里插入图片描述
    上图中标记黄色部分就是与上节调用drive方法不同的地方。
    本节结合案例介绍了使用__setattr__方法定义实例方法并使用MethodType绑定该方法和实例对象的过程,其本质是与《第8.12节 Python类中使用__dict__定义实例变量和方法》的绑定是一样的。
    老猿Python,跟老猿学Python!
    博客地址:https://blog.csdn.net/LaoYuanPython

    请大家多多支持,点赞、评论和加关注!谢谢!
原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643713.html