将一个对象绑定到另一个对象

时间:2016-11-23 16:51:23

标签: python methods types instance

我将一个方法从一个对象绑定到另一个对象时出错。

关于最新情况的简单猜测...我相信我得到的错误是由于树皮方法仍然绑定到原始对象。因此,在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)

1 个答案:

答案 0 :(得分:0)

好的,这样做的正确方法...由于绑定方法是包装函数,你必须通过d.bark.im_func找到未绑定的方法

hd = Husky()
hd.bark = types.MethodType( d.bark.im_func ,hd,Husky)
hd.bark()