अजगर में प्रतिबिंब जावा की तुलना में बहुत आसान और कहीं अधिक लचीला है।
मैं इस ट्यूटोरियल को पढ़ने की सलाह देता हूं
कोई प्रत्यक्ष कार्य नहीं है (जो मुझे पता है) जो पूरी तरह से योग्य वर्ग का नाम लेता है और वर्ग को वापस करता है, हालांकि आपके पास इसे बनाने के लिए आवश्यक सभी टुकड़े हैं, और आप उन्हें एक साथ जोड़ सकते हैं।
हालांकि सलाह का एक सा: जब आप अजगर में हैं तो जावा शैली में प्रोग्राम करने की कोशिश न करें।
यदि आप बता सकते हैं कि ऐसा क्या है जिसे आप करने की कोशिश कर रहे हैं, तो शायद हम आपको इसे करने का एक और अधिक आकर्षक तरीका खोजने में मदद कर सकते हैं।
यहाँ एक फ़ंक्शन है जो आप चाहते हैं:
def get_class( kls ):
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__( module )
for comp in parts[1:]:
m = getattr(m, comp)
return m
आप इस फ़ंक्शन के रिटर्न मान का उपयोग कर सकते हैं जैसे कि यह वर्ग ही था।
यहाँ एक उपयोग उदाहरण है:
>>> D = get_class("datetime.datetime")
>>> D
<type 'datetime.datetime'>
>>> D.now()
datetime.datetime(2009, 1, 17, 2, 15, 58, 883000)
>>> a = D( 2010, 4, 22 )
>>> a
datetime.datetime(2010, 4, 22, 0, 0)
>>>
वह कैसे काम करता है?
हम __import__
उस मॉड्यूल को आयात करने के लिए उपयोग कर रहे हैं जो वर्ग को रखता है, जिसके लिए आवश्यक है कि हम पहले मॉड्यूल का नाम पूरी तरह से योग्य नाम से निकालें। फिर हम मॉड्यूल आयात करते हैं:
m = __import__( module )
इस मामले में, m
केवल शीर्ष स्तर के मॉड्यूल को संदर्भित करेगा,
उदाहरण के लिए, यदि आपकी कक्षा foo.baz
मॉड्यूल में रहती है , तो मॉड्यूल m
होगा foo
हम आसानी से foo.baz
उपयोग करने के लिए एक संदर्भ प्राप्त कर सकते हैंgetattr( m, 'baz' )
शीर्ष स्तर के मॉड्यूल से कक्षा में आने के लिए gettatr
, कक्षा के नाम के हिस्सों पर पुनरावर्ती उपयोग करना होगा
उदाहरण के लिए कहें, यदि आप वर्ग का नाम है foo.baz.bar.Model
तो हम ऐसा करते हैं:
m = __import__( "foo.baz.bar" ) #m is package foo
m = getattr( m, "baz" ) #m is package baz
m = getattr( m, "bar" ) #m is module bar
m = getattr( m, "Model" ) #m is class Model
इस लूप में यही हो रहा है:
for comp in parts[1:]:
m = getattr(m, comp)
लूप के अंत में, m
कक्षा का एक संदर्भ होगा। इसका मतलब यह है कि m
वास्तव में यह वर्ग है, आप उदाहरण के लिए कर सकते हैं:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
, जिसे अजगर 3 से 2.7 ( docs.python.org/2/library/importlib.html ) पर वापस पा लिया गया था