2016-11-23 6 views
0

У меня возникла ошибка, связывающая метод с одного объекта на другой.Метод привязки одного объекта к другому

Простая догадка о том, что происходит ... Я считаю, что ошибка, которую я получаю, связана с тем, что метод коры все еще связан с исходным объектом. Поэтому в функцию hd.bark() вставляются два элемента self.

EDIT:

Моя цель здесь поддерживать 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

Это не для меня ясно, что вы пытаетесь достичь. Кроме того, является 'borderBark' частью' класса Husky'? – sal

+0

Я обезьяна исправляю функцию во время выполнения и заменяю метод, выделенный в другой части кода. Т.е. это так, что я могу использовать одну и ту же функцию для работы, но иметь возможность менять данные, которые я использую. – CodeMode

+0

Спасибо, что посмотрели :) – CodeMode

ответ

0

Ok поэтому сотрудничество дый правильный способ сделать это ... Так как связанные методы завернутых функций вы должны найти несвязанный метод с помощью d.bark.im_func

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