2011-11-29 58 views
17

我需要一堆類變量的,我想通過這樣的一個列表循環,從而做到這一點:如何創建類變量,動態地在python

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

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

這可能嗎?我不想讓它們作爲實例(在__init__中使用self),而是作爲類變量。

+2

爲什麼不把它們放在字典中? – DrTyrsa

+0

你想分享不同實例之間的變量嗎? – luc

+0

不確定。最有可能的。需求來自API,我不知道它們在那裏如何使用。 – 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

啊。這很酷。我會給它一個去看看我工作的API是否可以處理。謝了哥們! – 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' for for循環與'__new__'參數衝突 –

+0

@UszyWieloryba謝謝,更正 – Duncan