मुद्दा यह है कि जब आप करते हैं -
from a import Real, Fake
आप मूल रूप से अपने initialize
स्क्रिप्ट के नाम स्थान में उन दो वर्गों आयात कर रहे हैं और initialize
स्क्रिप्ट के नाम स्थान में Real
और Fake
नाम बनाने । फिर आप Real
initialize
स्क्रिप्ट पॉइंट Fake
पर नाम बनाते हैं, लेकिन यह वास्तविक a
मॉड्यूल में कुछ भी नहीं बदलता है। initialize
स्क्रिप्ट एक और .py
मॉड्यूल/अपने मूल कार्यक्रम के शुरू में रन पर स्क्रिप्ट है
है, तो आप नीचे का उपयोग कर सकते हैं -
if env == 'dev':
import a
a.Real = a.Fake
कृपया ध्यान दें, इस Fake
वर्ग का उल्लेख करने के a.Real
होगा जब भी आप उपरोक्त पंक्ति निष्पादित होने के बाद a
मॉड्यूल से Real
का उपयोग करते हैं।
हालांकि मैं सुझाव है कि एक बेहतर तरीका अपने a
मॉड्यूल अपने आप में यह करने के लिए, यह संभव है कि मॉड्यूल में env
जाँच करने के लिए कर रही है, के रूप में द्वारा होगा -
if <someothermodule>.env == 'dev':
Real = Fake
जैसा टिप्पणियों में पूछा गया था -
स्क्रिप्ट के नामस्थान को प्रारंभ करने में भी आयात आयात नहीं करता है? मॉड्यूल और कक्षाओं के आयात के बीच क्या अंतर है?
बात यह है कि जब तुम सिर्फ वर्ग from a import class
, क्या आप वास्तव में ऐसा है कि चर, class
अपने मॉड्यूल नाम स्थान में बनाने (मॉड्यूल है कि आप इसे करने के लिए आयात में) का उपयोग करते हुए, उस चर को इंगित करने के बदलते आयात उस मॉड्यूल नेमस्पेस में कुछ नया मूल वर्ग को मूल मॉड्यूल-ऑब्जेक्ट में प्रभावित नहीं करता है, यह केवल उस मॉड्यूल में प्रभावित होता है जिसमें इसकी बदली गई है।
लेकिन जब आप import a
करते हैं, तो आप सिर्फ मॉड्यूल a
आयात कर रहे हैं (और जब तक मॉड्यूल वस्तु भी sys.modules
शब्दकोश में कैश हो जाता है का आयात, इसलिए किसी भी अन्य मॉड्यूल से a
के लिए किसी भी अन्य आयात sys.modules
से इस कैश्ड संस्करण मिलेगा) (एक और नोट, यह है कि from a import something
भी आंतरिक रूप से a
आयात करता है और इसे sys.modules
में कैश करता है, लेकिन मुझे उन विवरणों में शामिल नहीं होने देता है क्योंकि मुझे लगता है कि यह आवश्यक नहीं है)।
और फिर जब आप a.Real = <something>
करते हैं, आप a
मॉड्यूल वस्तु है, जो, वर्ग की ओर इशारा करता कुछ और करने के लिए की Real
विशेषता बदल रहे हैं, यह सीधे a
मॉड्यूल mutates, इसलिए परिवर्तन भी देखा जा सकता है जब मॉड्यूल a
कुछ अन्य मॉड्यूल से आयात किया जाता है।
यह प्रारंभिक स्क्रिप्ट क्या है यह एक और '.py' है जो आपके मूल कार्यक्रम की शुरुआत में चलता है? –
हां यह एक Django ऐप है, इसलिए init स्क्रिप्ट app.py में है, मैंने सामान्य होने के उद्देश्य से इसका उल्लेख नहीं किया है। –