2008-10-21 17 views
30

मैं जानना चाहता हूं कि पाइथन में ऑब्जेक्ट्स और फ़ंक्शन नामों के लिए चर का उपयोग कैसे करें। PHP में, आप यह कर सकते हैं:पायथन में कक्षा नामों के लिए चर का उपयोग करना?

$className = "MyClass"; 

$newObject = new $className(); 

पाइथन में आप इस तरह की चीज कैसे करते हैं? या, क्या मैं पूरी तरह से पाइथन के साथ कुछ मौलिक अंतर की सराहना नहीं कर रहा हूं, और यदि हां, तो यह क्या है?

+0

मुझे यह जानने में दिलचस्पी होगी कि आपको ऐसा करने की आवश्यकता क्यों है - मुझे लगता है कि एक और पाइथोनिक तरीका हो सकता है जिसके लिए आवश्यकता नहीं है परिवर्तनीय वर्ग के नाम। – TimB

+0

"क्या मैं पाइथन के साथ कुछ मौलिक अंतर की पूरी तरह से सराहना नहीं कर रहा हूं, और यदि हां, तो यह क्या है?" संभवतः आप उपरोक्त एक्सा जैसे कोड का उपयोग क्यों करते हैं mple? कृपया एक बड़ा उदाहरण प्रदान करें जो कुछ संदर्भ प्रदान करता है। –

+0

दिलचस्प है, लेकिन मैं टिमबी से सहमत हूं, मैं इसके लिए उपयोग केस सुनना चाहता हूं। – monkut

उत्तर

21

अजगर में,

className = MyClass 
newObject = className() 

पहली पंक्ति चर classNameMyClass के रूप में एक ही बात का उल्लेख करता है। फिर अगली पंक्ति className परिवर्तक के माध्यम से MyClass कन्स्ट्रक्टर को कॉल करती है।

एक ठोस उदाहरण के रूप में: (। अजगर में, listlist वर्ग के लिए निर्माता है)

>>> className = list 
>>> newObject = className() 
>>> newObject 
[] 

अंतर यह है कि PHP में, आप वर्ग आप चाहते हैं उसका नाम का प्रतिनिधित्व करते है एक स्ट्रिंग के रूप में संदर्भित करने के लिए, जबकि पायथन में आप सीधे उसी कक्षा का संदर्भ दे सकते हैं। यदि आप एक स्ट्रिंग का उपयोग करना चाहिए (उदाहरण के लिए यदि कक्षा का नाम गतिशील रूप से बनाया गया है), तो आपको अन्य तकनीकों का उपयोग करने की आवश्यकता होगी।

+12

डाउनवॉटेड, क्योंकि आपका समाधान प्रश्न में से किसी से मेल नहीं खाता है। वह जो खोज रहा है वह एक स्ट्रिंग के साथ कक्षा का तात्कालिकता है। – reggie

+1

कृपया पीईपी 8 पर रखें। मिश्रित कैस नामों का उपयोग कुछ मूल्यों के खिलाफ कुछ हद तक लगता है। – dcsordas

+0

पहली टिप्पणी के साथ सहमत हैं, यह एक वर्चुअल – Matt

4

यदि आपके पास इस:

class MyClass: 
    def __init__(self): 
     print "MyClass" 

तो आप आमतौर पर ऐसा करते हैं:

>>> x = MyClass() 
MyClass 

लेकिन तुम भी जो है मैं क्या लगता है कि आप पूछ रहे हैं इस, कर सकता है:

>>> a = "MyClass" 
>>> y = eval(a)() 
MyClass 

लेकिन, इस बारे में बहुत सावधान रहें कि आप "eval()" का उपयोग करते हुए स्ट्रिंग कहां प्राप्त करते हैं - यदि यह उपयोगकर्ता से आया है, तो आप अनिवार्य रूप से crea हैं एक विशाल सुरक्षा छेद ting।

अपडेट: type() का उपयोग करके कोलेफ़र के उत्तर में दिखाया गया है इस समाधान से काफी बेहतर है।

+9

ओएमजी में संग्रहीत कक्षा के नाम के लिए काम नहीं करता है, नहीं! Eval समारोह बुरा है। इसका प्रयोग न करें। – ddaa

+1

मैं कहूंगा कि यह अंगूठे का एक अच्छा अच्छा नियम है। –

+0

@ टीआईएमबी, मुझे लगता है कि यह मेरे लिए सबसे अच्छा जवाब होना चाहिए। – Gang

47

कि some_module मान लिया जाये कि एक वर्ग नाम "CLASS_NAME" है:

import some_module 
klass = getattr(some_module, "class_name") 
some_object = klass() 

मैं ध्यान दें कि आप यहाँ सावधान रहना चाहिए चाहिए:, कोड में तार मोड़ खतरनाक हो सकता है अगर स्ट्रिंग उपयोगकर्ता से आया है तो आप चाहिए इस स्थिति में सुरक्षा को ध्यान में रखें। :)

एक अन्य विधि (यह सोचते हैं कि हम अभी भी "CLASS_NAME" का उपयोग कर रहे हैं):

class_lookup = { 'class_name' : class_name } 
some_object = class_lookup['class_name']() #call the object once we've pulled it out of the dict 

बाद विधि शायद ऐसा करने का सबसे सुरक्षित तरीका है, तो यह संभव है कि आप पर यदि का उपयोग करना चाहिए है सब संभव।

+0

बहुत अच्छा, मैं गतिशील कक्षाओं और गतिशील क्षेत्रों के लिए एक हैंडल बना रहा हूँ। मैंने 'वर्ग = {'कक्षा 1' किया: कक्षा 1, 'कक्षा 2': कक्षा 2, ...}'। अब मैं ऑब्जेक्ट को 'myob = classes [' ) '। – Furbeenator

+0

ग्रेट, सरल चाल। मुझे यह पता चला से 2 घंटे पहले bugging था। धन्यवाद। –

18

यदि आपको पायथन में गतिशील कक्षा बनाने की आवश्यकता है (यानी।एक जिसका नाम एक चर रहा है) आप प्रकार) का उपयोग कर सकते हैं (जो 3 पैरामीटर लेता है: नाम, ठिकानों, attrs

>>> class_name = 'MyClass' 
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'}) 

<class '__main__.MyClass'> 

>>> inst = klass() 
>>> inst.msg 
foobarbaz 
  • नोट तथापि, कि यह नहीं 'इन्स्तांत' ऑब्जेक्ट (यानी फोन नहीं करता करता है रचनाकार इत्यादि। यह एक ही नाम के साथ एक नया (!) वर्ग बनाता है।
संबंधित मुद्दे