2011-11-29 19 views
17

में गतिशील रूप से मैं कक्षा चर का एक गुच्छा बनाने की जरूरत है बनाने के लिए और मुझे लगता है कि जैसे एक सूची के माध्यम से पाशन द्वारा यह करने के लिए करना चाहते हैं:कैसे वर्ग चर अजगर

vars=('tx','ty','tz') #plus plenty more 

class Foo(): 
    for v in vars: 
     setattr(no_idea_what_should_go_here,v,0) 

यह संभव है? मैं उन्हें एक उदाहरण के लिए नहीं बनाना चाहता हूं (__init__ में स्वयं का उपयोग करके) लेकिन कक्षा चर के रूप में।

+2

उन्हें क्यों नहीं रखा जाए? – DrTyrsa

+0

क्या आप विभिन्न उदाहरणों के बीच थीस चर साझा करना चाहते हैं? – luc

+0

सुनिश्चित नहीं है। सबसे अधिक संभावना। आवश्यकता एक एपीआई से आती है और मुझे नहीं पता कि उनका उपयोग कैसे किया जाता है। – pawel

उत्तर

27

आप तुरंत बाद एक वर्ग बनाई गई है प्रविष्टि कोड चला सकते हैं:

class Foo(): 
    ... 

vars=('tx', 'ty', 'tz') # plus plenty more 
for v in vars: 
    setattr(Foo, v, 0) 

इसके अलावा, आप गतिशील रूप से चर स्टोर कर सकते हैं, जबकि कक्षा बनाया जा रहा है:

class Bar: 
    locals()['tx'] = 'texas' 
+0

आह। यह अच्छा है। मैं इसे जाने दूंगा और देख सकता हूं कि जिस एपीआई के साथ मैं काम करता हूं वह इसे संभाल सकता है। धन्यवाद दोस्त! – pawel

5

किसी भी कारण से यदि आप कक्षा निर्माण के बाद उन्हें स्थापित करने के रेमंड के जवाब का उपयोग नहीं कर सकते हैं, तो शायद आप मेटाक्लास का उपयोग कर सकते हैं:

class MetaFoo(type): 
    def __new__(mcs, classname, bases, dictionary): 
     for name in dictionary.get('_extra_vars',()): 
      dictionary[name] = 0 
     return type.__new__(mcs, classname, bases, dictionary) 

class Foo(): # For python 3.x use 'class Foo(metaclass=MetaFoo):' 
    __metaclass__=MetaFoo # For Python 2.x only 
    _extra_vars = 'tx ty tz'.split() 
+1

'name' में '__new__' तर्क –

+0

@UszyWieloryba धन्यवाद, सुधार के साथ लूप क्लैश के लिए – Duncan

1

पार्टी के लिए देर हो चुकी है लेकिन type class constructor का उपयोग करें!

Foo = type("Foo",(), {k: 0 for k in ("tx", "ty", "tz")}) 
संबंधित मुद्दे