我将一个方法从一个对象绑定到另一个对象时出错。
关于最新情况的简单猜测...我相信我得到的错误是由于树皮方法仍然绑定到原始对象。因此,在hd.bark()函数中插入了两个self。
修改
我的目标是在交换策略对象时保持数据加载策略的“后处理功能”的buissness逻辑......我知道这不是一个好的做法,但这是一个小的黑客来获得一些命令行功能< / p>
import types
from copy import deepcopy
class Dog(object):
def bark(self):
print 'bark bark bark'
class Husky(object):
def bark(self):
print 'ruff ruff'
def borderBark(self):
print 'border bark'
d = Dog()
d.bark()
h = Husky()
h.bark()
b = Dog()
b.bark = types.MethodType(borderBark,b)
b.bark()
hd = Husky()
bark = types.MethodType(deepcopy(d.bark),None, Husky)
print d.bark
print bark
hd.bark = types.MethodType(bark,hd,Husky)
print hd.bark
hd.bark()
输出:
bark bark bark
ruff ruff
border bark
<bound method Dog.bark of <__main__.Dog object at 0x000000004D9EC0B8>>
<unbound method Husky.bark>
<bound method Husky.bark of <__main__.Husky object at 0x00000000599616D8>>
Traceback (most recent call last):
File "<ipython-input-50-1279b42a4bd2>", line 29, in <module>
hd.bark()
TypeError: bark() takes exactly 1 argument (2 given)
答案 0 :(得分:0)
好的,这样做的正确方法...由于绑定方法是包装函数,你必须通过d.bark.im_func找到未绑定的方法
hd = Husky()
hd.bark = types.MethodType( d.bark.im_func ,hd,Husky)
hd.bark()