2016-11-23 118 views
0

我遇到了将一个对象从一个对象绑定到另一个对象的错误。将一个对象绑定到另一个对象

一个简单的猜测是什么发生了...我相信我得到的错误是由于树皮方法仍然被绑定到原始对象。因此,将两个自我插入到hd.bark()函数中。

编辑:

我的目标是维持AA数据加载策略的“后处理功能”的buissness逻辑,同时交换策略对象......我知道这是不是一个好的做法然而,这是一个小黑客得到一些命令行功能

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

找到不受约束的方法目前尚不清楚对我来说,你正在努力实现的目标。另外,是'Husky'级的'borderBark'部分? – sal

+0

我是在运行时修补一个函数的猴子,并且在代码的另一部分换出了一个分配的方法。也就是说,我可以使用相同的功能来完成工作,但能够交换我正在使用的数据。 – CodeMode

+0

谢谢你的看法:) – CodeMode

回答

0

确定这样的合作rrect办法做到这一点......因为绑定方法被包装的功能,你必须通过d.bark.im_func

hd = Husky() 
hd.bark = types.MethodType(d.bark.im_func ,hd,Husky) 
hd.bark() 
相关问题