会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 替换一个实例方法,没你想的那么简单!

替换一个实例方法,没你想的那么简单

时间:2025-11-04 23:23:47 来源:益强数据堂 作者:应用开发 阅读:874次

思路一:简单地替换

当你想对类实例的替换方法进行替换时,你可能想到的个实是直接对他进行粗暴地替换:

class People:     def speak(self):         print("hello, world") def speak(self):     print("hello, python") p = People() p.speak = speak p.speak() 

但当你试着执行这段代码的时候,就会发现行不通,例方它提示我们要传入 self 参数:

Traceback (most recent call last):   File "/Users/MING/Code/Python/demo.py",法没 line 12, in <module>     p.speak() TypeError: speak() missing 1 required positional argument: self 

不对啊~ self 不是实例本身吗?函数不是一直就这么写的?

实际上你这么替换,speak 就变成了一个 function,那简而不是替换一个和实例绑定的 method ,你可以把替换前后的个实 speak 打印出来

p = People() print(p.speak) p.speak = speak print(p.speak) 

输出结果如下,区别非常明显

<bound method People.speak of <__main__.People object at 0x10cfa7fd0>> <function speak at 0x10ca10040> 

这种方法,例方只能用在替换不与实例绑定的法没静态方法上,不然你每次调用的那简时候,就得手动传入实例本身,替换但这样调用就会变得非常怪异。亿华云计算个实

思路二:利用 im_func

有 Python 2 使用经验的例方朋友,可以会知道类实例的法没方法,都有 im_func 和 im_class 属性,那简分别指向了该方法的函数和类。

很抱歉的是,这些在 Python3 中全都取消了,意味你无法再使用 im_func 和 im_class 。

但即使你身处 Python 2 的环境下,你想通过 im_func 去直接替换函数,也仍然是有问题的。

因为在 Python2 中不推荐普通用户对类实例的方法进行替换,所以 Python 给类实例的方法赋予了只读属性

思路三:非常危险的字节码替换

表层不行,IT技术网但这个方法在字节码层面却是可行的

这种方法,非常的粗暴且危险,他会直接影响到使用 People 的所有实例的 speak 方法,因此这种方法千万不要使用。

思路四:利用 types 绑定方法

在 types 中有一个 MethodType,可以将普通方法与实例进行绑定。

绑定后,就可以直接替换掉原实例的 speak 方法了,完整代码如下:

import types class People:     def speak(self):         print("hello, world") def speak(self):     print("hello, python") p = People() p.speak = types.MethodType(speak, p) p.speak() 

这种方法,最为安全,不会影响其他实例。并且 Python 2 和 Python 3 都适用,是官方推荐的一种做法。

总结一下

直接替换:只适用于静态方法 使用 im_func 替换:行不通 使用 im_func.func_code 替换字节码:非常危险,请不要使用 使用 types.MethodType 进行方法绑定:安全且有效,云服务器推荐使用

(责任编辑:数据库)

推荐内容
  • 探究惠普电脑开机时间错误的原因及解决方法(深入分析惠普电脑开机时间异常问题,帮助您解决困扰)
  • 员工必知!十大常见网络钓鱼模板
  • Cacti百分比监控算法
  • 利用SSH加密实现的HTTP隧道分析与检测
  • 解决电脑开机显示英文Windows错误恢复的问题(从错误诊断到系统恢复,帮助您解决电脑开机故障)
  • 监测Linux上面的流量MRTG-安装MRTG