Python中如何通过实例对象重写类方法?
解决Python实例动态修改方法的报错问题
问题原因
直接给实例赋值普通函数时,这个函数不会被Python自动绑定到实例上。类里的方法之所以能自动传入self,是因为它们属于绑定方法——当通过实例调用类定义的方法时,Python会自动把实例作为第一个参数传递给方法。但你直接给foo.method赋值new_method后,foo.method只是一个普通的函数属性,调用时不会自动传入self,自然就会报参数缺失的错误。
解决方案
方案1:用types.MethodType绑定函数到实例
这是最规范的做法,通过types.MethodType把普通函数包装成实例的绑定方法,这样调用时就会自动传入self:
import types class Foo: def __init__(self, x): self.x = x def method(self): print("original method") return self.x def new_method(self): print("new method") return self.x foo = Foo(1) # 把new_method绑定到foo实例上 foo.method = types.MethodType(new_method, foo) print(foo.method()) # 输出:new method 1
方案2:手动传入实例作为self参数(不推荐)
如果只是临时测试,可以手动把实例作为第一个参数传给函数,但这种写法不符合Python的方法调用习惯,不建议在实际代码中使用:
foo = Foo(1) foo.method = new_method print(foo.method(foo)) # 手动传入foo作为self参数
额外说明
- 修改类的方法(
Foo.method = new_method)会影响所有该类的实例,包括修改后创建的新实例; - 修改单个实例的方法只会影响当前实例,其他实例不受影响。
内容的提问来源于stack exchange,提问作者emixd
相关产品推荐
相关产品推荐

