2012-05-31 41 views
17

İçe aktarma yönteminin kullanıldığı ... geçersiz kılma yönteminde sorun yaşıyorum. Bir veya b modülünde kodu değiştirmeden print_message (MSG) yöntemini geçersiz istiyorumİçe aktarma modülü yöntemi nerede ... içe aktarma kullanılıyor

# a.py module 
def print_message(msg): 
    print(msg) 

# b.py module 
from a import print_message 
def execute(): 
    print_message("Hello") 

# c.py module which will be executed 
import b 
b.execute() 

: Bazı örnek sorunu göstermek için. Birçok yönden denedim ama ... ithalatı ithal eden orijinal yöntem. Kodu değiştirdiğimde benden değiştirdiğimden

.

Bu sorunu nasıl çözeceğimi önerir misiniz?
Küçük bir örnek için şimdiden teşekkür ederiz.

Saygılarımızla

------------------ Güncelleme ------------------
ben Bunu aşağıdaki gibi yapmayı denedim:

# c.py module 
import b 
import a 
import sys 
def new_print_message(msg): 
    print("New content") 
module = sys.modules["a"] 
module.print_message = new_print_message 
sys.module["a"] = module 

Fakat bu benim için kullandığım yerde çalışmıyor ... import statement. Sadece ithalat için çalışıyor ama yazdığım gibi b.py ve a.py modüllerinde kod değiştirmek istemiyorum. Size dokunulmamış a ve b modülleriyle

+0

(1) Tam olarak "geçersiz kılma" ile ne demek istiyorsunuz? Maymun yama? (2) Sunduğunuz kodda, sadece bir tane 'print_message()' vardır. – NPE

+0

Yazdırmak için print_message() yöntemini değiştirmek istiyorum. "Yeni içerik" mesajı. A.py ve b.py'de değişiklik olmadan c.py dosyasından nasıl edinilir? Açıklama "maymun yama" açıklaması ve açıklaması için – Pawel

+0

: http://stackoverflow.com/a/6647776/1498405 – hardmooth

cevap

29

şöyle c uygulamayı da deneyebilirsiniz: İlk ithalat a zorunda

import a 

def _new_print_message(message): 
    print "NEW:", message 

a.print_message = _new_print_message 

import b 
b.execute() 

ardından fonksiyonunu geçersiz kılmak ve sonra a modülünü kullanabilirsiniz böylece b içe olduğunu zaten alındı ​​(ve değiştirildi).

+1

Kodunuz çalışıyor. Hatam, print_message yöntemini geçersiz kılmadan önce import b ifadesini koymam oldu. A.print_message = _new_print_message kodundan sonra import b ile çalışıyor. Yardım için teşekkürler. – Pawel

+0

PEP-8, tüm içe aktarma ifadelerini modülün üst kısmına koymanızı önerir. Bir .cpp dosyasının ortasında bir içerme ifadesine sahip olmakla aynı şeydir; Sadece acı dolu bir dünyada olacaksın. – Steztric