2016-11-23 5 views
0

한 개체에서 다른 개체로 메서드를 바인딩하는 동안 오류가 발생했습니다.한 개체를 다른 개체로 바인딩하는 방법

무슨 일이 벌어지고 있는지에 대한 간단한 추측 ... 내가 얻는 오류는 껍질 방법이 원래 개체에 여전히 바인딩되어 있기 때문에 발생한다고 생각합니다. 따라서 두 개의 self가 hd.bark() 함수에 삽입됩니다.

편집 :

여기 내 목표는 전략 객체를 교환 ... 내가 아는 동안 좋은 연습이 아직이가이다이 아닌 AA 데이터 로딩 전략의 '후 처리 기능'의 buissness 로직을 유지하다 공동 그렇게

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

달성하려는 작업이 확실하지 않습니다. 또한'borderBark'는'Husky 클래스'의 일부입니까? – sal

+0

나는 런타임에 함수를 패치하고 코드의 다른 부분에 할당 된 메소드를 스와핑한다. 즉 이것은 동일한 기능을 사용하여 작업을 수행 할 수 있지만 사용중인 데이터를 바꿀 수 있어야합니다. – CodeMode

+0

모양을 가져 주셔서 감사합니다 :) – CodeMode

답변

0

확인 : 작은 해킹 일부 명령 줄 기능

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() 

출력을 얻을 수 있습니다 바운드 메소드는 바인딩 된 메소드가 래핑 된 함수이므로 d.bark.im_func를 통해 언 바운드 메소드를 찾아야합니다.