बात है, भले ही पायथन के import
बयान नज़र जावा के लिए इसी तरह की लिए बनाया गया है, वे हुड के नीचे पूरी तरह से अलग बातें करते हैं। जैसा कि आप जानते हैं, जावा में import
कथन कंपाइलर के संकेत से वास्तव में थोड़ा अधिक है। यह मूल रूप से पूरी तरह से योग्य वर्ग नाम के लिए उपनाम सेट करता है। उदाहरण के लिए, जब आप
import java.util.Set;
बारे में यह संकलक कि उस फ़ाइल भर, जब आप Set
लिखते हैं, आप मतलब java.util.Set
बताता है। और यदि आप s.add(o)
लिखते हैं, जहां s
Set
प्रकार का ऑब्जेक्ट है, तो कंपाइलर (या बल्कि, लिंकर) बाहर निकलता है और विधि Set.class
में पाता है और इसके संदर्भ में रखता है।
लेकिन अजगर में,
(है कि एक बना हुआ मॉड्यूल, जिस तरह से होता है) कुछ पूरी तरह से अलग करता है। चूंकि पाइथन गतिशील संकल्प के साथ एक व्याख्या की गई भाषा है, इसलिए बाहर जाने और util.set
मॉड्यूल के कोड को देखने के लिए कोई कंपाइलर नहीं है। पाइथन में क्या होता है कि दुभाषिया util
नामक एक मॉड्यूल के साथ set
नामक एक मॉड्यूल के साथ एक पैकेज ढूंढता है और पैकेज और मॉड्यूल लोड करता है, और इस प्रक्रिया में, यह वास्तव में set
नामक विशेषता के साथ util
नामक ऑब्जेक्ट बनाता है। (यह सही है, पाइथन में संकुल और मॉड्यूल वास्तविक प्रथम श्रेणी की वस्तुएं हैं।) आप
util = __import__('util.set')
जहां समारोह __import__
एक वस्तु जो एक विशेषता set
कहा जाता है का उत्पादन के रूप में ऊपर बयान के बारे में सोच सकता है। असल में, वास्तव में ऐसा होता है जब आप मॉड्यूल आयात करते हैं - documentation for __import__
देखें। तो आप देखते हैं, जब आप पाइथन मॉड्यूल आयात करते हैं, तो आपको वास्तव में जो मिलता है वह शीर्ष-स्तर पैकेज, util
से संबंधित एक ऑब्जेक्ट है, और set
तक पहुंच प्राप्त करने के लिए आपको उसमें जाना होगा।
के रूप में कम से कम एक अन्य जवाब में उल्लेख किया है, आप
from util import set
या
import util.set as set
लिख सकता है यह अभी भी उस में मॉड्यूल set
साथ पैकेज util
आयात करता है, लेकिन इसके बजाय एक चर बनाने का वर्तमान क्षेत्र में util
, यह एक चर set
बनाता है जो util.set
को संदर्भित करता है। परदे के पीछे, इस तरह की तरह
_util = __import__('util', fromlist='set')
set = _util.set
del _util
पूर्व के मामले में
, या
बाद में
_util = __import__('util.set')
set = _util.set
del _util
काम करता है (हालांकि दोनों तरीकों से अनिवार्य रूप से एक ही बात करते हैं)। यह रूप अर्थात्मक रूप से जावा की तरह अधिक है; यह किसी उपनाम (set
) को उस चीज़ पर परिभाषित करता है जो आम तौर पर पूरी तरह से योग्य नाम (util.set
) द्वारा केवल पहुंच योग्य होगा।
"आयात करने की आवश्यकता" से आपका क्या मतलब है? क्या आप foo.bar को पहले आयात करने के बिना काम करने की उम्मीद करते हैं? आप कैसे जानेंगे कि foo जावा में सामान्य चर – mb14
@ mb14 की बजाय मॉड्यूल है, आप सीधे अपने कोड में पैकेज नाम के साथ पूरी तरह से योग्य क्लास नाम का उपयोग करके आयात किए बिना किसी अन्य पैकेज में कक्षाओं का उपयोग कर सकते हैं। उदाहरण के लिए, आप अपने स्रोत में जावा की सूची इंटरफ़ेस को "java.util.List" के रूप में संदर्भित कर सकते हैं या इसे पहले आयात कर सकते हैं, फिर इसे "सूची" के रूप में देखें। जिस तरह से पाइथन जावा से आ रहा है, ऐसा लगता है कि आप java.util.List आयात कर रहे हैं, फिर भी आपको अपने कोड में "सूची" के बजाय "java.util.List" लिखना होगा। – Jeff