2010-08-10 11 views
26

मेरे पास कक्षा के नामों की सूची है और वे अपने उदाहरण गतिशील रूप से बनाना चाहते हैं। उदाहरण के लिए:पायथन में कक्षा के उदाहरण को गतिशील रूप से कैसे बनाया जाए?

names=[ 
'foo.baa.a', 
'foo.daa.c', 
'foo.AA', 
.... 
] 

def save(cName, argument): 
aa = create_instance(cName) # how to do it? 
aa.save(argument) 

save(random_from(names), arg) 

पाइथन में गतिशील रूप से उन उदाहरणों को कैसे बनाया जाए? धन्यवाद!

उत्तर

18

इस बार प्रतिबिंब या कभी कभी आत्मनिरीक्षण के रूप में जाना जाता है। एक इसी तरह के सवाल आपको बस इतना करना कोशिश कर रहे हैं के लिए एक जवाब है की जाँच करें:

Does Python Have An Equivalent to Java Class forname

Can You Use a String to Instantiate a Class in Python

+1

उन उदाहरणों में से कुछ उदाहरण '__import__' का उपयोग करते हैं, नए कोड के लिए आप' importlib' http://docs.python.org/dev/library/importlib.html पर स्विच कर सकते हैं। (py> = 2.7 |> = 3.1) – SiggyF

+1

लिंक का उपयोग न करें, कृपया एक वास्तविक विवरण प्रदान करें। – shadowbq

3

आप अपनी कक्षाओं को तुरंत चालू करने के लिए पाइथन eval() कथन का उपयोग कर सकते हैं। इस तरह:

aa = eval(cName)() 
+4

eval का उपयोग न करें, क्योंकि यह सुरक्षा के मुद्दों के लिए अतिसंवेदनशील है। – Necrolyte2

+1

और यह कैसे संवेदनशील है? –

4

आप अक्सर इस बात का स्ट्रिंग प्रसंस्करण हिस्सा पूरी तरह से बच सकते हैं।

import foo.baa 
import foo.AA 
import foo 

classes = [ foo.baa.a, foo.daa.c, foo.AA ] 

def save(theClass, argument): 
    aa = theClass() 
    aa.save(argument) 

save(random.choice(classes), arg) 

ध्यान दें कि हम कक्षा के नाम की स्ट्रिंग प्रस्तुति का उपयोग नहीं करते हैं।

पायथन में, आप केवल कक्षा का उपयोग कर सकते हैं।

+0

मान लीजिए कि सरणी डेटाबेस से आता है। तो यह समाधान मदद नहीं करता है। –

27

मान लें आप पहले से ही की तरह

from [app].models import * 

कुछ का उपयोग कर प्रासंगिक वर्गों आयात किया है तुम सब करने की आवश्यकता होगी

klass = globals()["class_name"] 
instance = klass() 
संबंधित मुद्दे