2011-11-29 63 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