思路一:简单替换当你想替换一个类实例的方法时,你可能会想到直接替换:classPeople:defspeak(self):print("hello,world")defspeak(self):print("hello,p??ython")p=People()p.speak=speakp.speak()但是当你尝试执行这段代码时,你会发现它不会'不行,提示我们传入self参数:Traceback(mostrecentcalllast):File"/Users/MING/Code/Python/demo.py",line12,inp.speak()TypeError:speak()missing1requiredpositionaargument:'self'错了~self不是实例本身吗?函数不都是这样写的吗?事实上,如果你这样替换它,speak就变成了一个函数,而不是绑定到实例的方法。可以把替换前后的speak打印出来p=People()print(p.speak)p.speak=speakprint(p.speak)输出结果如下,区别很明显这个方法,只能用来替换没有绑定实例的静态方法,否则每次调用都要手动传入实例本身,但是这个调用会变得很奇怪.思路二:使用im_func用过Python2的朋友可能知道类实例的方法,都有im_func和im_class属性,分别指向方法的函数和类。不幸的是,这些在Python3中都被删除了,这意味着您不能再使用im_func和im_class。但是即使是在Python2环境下,如果想直接把函数替换成im_func,还是有问题的。因为在Python2中不建议普通用户替换类实例的方法,所以Python赋予了类实例的方法只读属性。这种方法是可行的。这是非常粗鲁和危险的。它会直接影响所有People实例的speak方法,所以这个方法绝对不能用。思路四:使用types绑定方法,在types中有一个MethodType,可以将普通的方法绑定到实例上。绑定后,可以直接替换原实例的speak方法。完整代码如下:importtypesclassPeople:defspeak(self):print("hello,world")defspeak(self):print("hello,p??ython")p=People()p.speak=types.MethodType(speak,p)p.speak()是最安全的方法,不会影响其他实例。并且Python2和Python3都适用,这是官方推荐的做法。总结直接替换:只对静态方法有效用im_func替换:不起作用用im_func.func_code替换字节码:非常危险,不要使用Methodbindingwithtypes.MethodType:安全有效,推荐