2015-08-21 6 views
1

Я хочу переопределить внутреннюю функцию для некоторого стороннего кода. Вот пример моих намерений.override (monkeypatch) функция в стороннем модуле, используемая другими функциями в этом стороннем модуле

(редактирование: Я исправил орфографическую ошибку ниже, а теперь это делает работы по назначению)

#--- dog.py (3rd party code) --- 
def _bark(): 
    print("WOOF!") 

def make_it_bark(): 
    _bark() 

#--- make_catlike.py (my code)--- 
import dog 
dog._bark = lambda: print("MEOW") #<<-- 'bark' in original, so failed!!!! 
dog.make_it_bark() 
# edit: now prints out "MEOW" instead of "WOOF!" like I want 

Как получить 3-й код участник dog.py использовать моей версии of_bark?

[заключение: Это было сделано только из-за ошибки ошибки правописания. Спасибо за помощь !!]

ответ

1

В коде, который вы указали, убедитесь, что вы не забыли символ подчеркивания при переопределении функции _bark. Если вы хотите изменить метод класса, хорошей идеей было бы наследовать этот класс и метод переопределения в вашем классе.

1

У вас есть простая опечатка в make_catlike.py --- у вас отсутствует ведущий символ подчеркивания. Весь файл следует читать:

#--- make_catlike.py (my code)--- 
import dog 
dog._bark = lambda: print("MEOW") 
# ^-------- Underscore was missing. 
dog.make_it_bark() # Prints "MEOW". 

Обратите внимание, что, в более сложных случаях, другие виды вещей может пойти не так ...

Например, если поведение, которое вы хотите изменить случается, когда модуль импортированный, изменяющий код модуля послеimport dog возврат не поможет.