2012-05-31 9 views
17

मुझे उस विधि को ओवरराइड करने में समस्या है जहां से ... आयात कथन का उपयोग किया जाता है।मॉड्यूल विधि को ओवरराइड करें जहां से ... आयात का उपयोग किया जाता है

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

मैं एक या बी मॉड्यूल में कोड बदले बिना print_message (एमएसजी) विधि ओवरराइड करने के लिए करना चाहते हैं: कुछ उदाहरण समस्या को वर्णन करने। मैंने कई तरीकों से कोशिश की लेकिन आयात ... आयात आयात मूल विधि। जब मैंने कोड बदल दिया तो

import a 
a.print_message 

मेरे परिवर्तन को देखने के बजाय।

क्या आप इस समस्या को हल करने का सुझाव दे सकते हैं?
किसी भी छोटे उदाहरण के लिए अग्रिम धन्यवाद।

बेस्ट सादर

------------------ अद्यतन ------------------
मैं ऐसा करने की कोशिश की गई जैसे कि:

# 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 

लेकिन यह काम नहीं कर रहा है जहां मैं उपयोग कर रहा हूं ... आयात विवरण। केवल आयात के लिए काम कर रहा है लेकिन जैसा कि मैंने लिखा है, मैं b.py और a.py मॉड्यूल में परिवर्तन कोड नहीं चाहता हूं।

+0

(1) "ओवरराइड" से आपका क्या मतलब है? बंदर पैच? (2) आपके द्वारा पेश किए गए कोड में, केवल एक 'print_message() 'है। – NPE

+0

मैं मुद्रित करने के लिए print_message() विधि को बदलना चाहता हूं उदा। "नई सामग्री" संदेश। A.py और b.py में बदलाव किए बिना c.py फ़ाइल से इसे कैसे प्राप्त करें? "बंदर पैच" के स्पष्टीकरण और प्रदर्शन के लिए – Pawel

+0

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

उत्तर

29

आप अछूता अपने a और b मॉड्यूल के साथ इस प्रकार c को लागू करने की कोशिश कर सकते:

import a 

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

a.print_message = _new_print_message 

import b 
b.execute() 

आप पहली बार आयात a करने के लिए है, तो समारोह को ओवरराइड और फिर b आयात इतना है कि यह a मॉड्यूल का उपयोग होता है कि पहले ही आयात किया गया है (और बदला गया)।

+1

आपका कोड काम कर रहा है। मेरी गलती यह थी कि मैंने print_message विधि को ओवरराइड करने से पहले आयात बी स्टेटमेंट रखा था। A.print_message = _new_print_message कोड के बाद आयात बी के साथ काम कर रहा है। मदद के लिए धन्यवाद। – Pawel

+0

पीईपी -8 मॉड्यूल के शीर्ष पर सभी आयात विवरण डालने की सिफारिश करता है। यह एक .cpp फ़ाइल के बीच में एक कथन शामिल करने जैसा ही है; आप बस दर्द की दुनिया में खत्म हो जाएगा। – Steztric

संबंधित मुद्दे