Как создать переменную класса динамически в Python - PullRequest
18 голосов
/ 29 ноября 2011

Мне нужно создать кучу переменных класса, и я хотел бы сделать это, просматривая список следующим образом:

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

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

возможно ли это?Я не хочу делать их для экземпляра (используя self в __init__), но как переменные класса.

Ответы [ 3 ]

34 голосов
/ 29 ноября 2011

Вы можете запустить код вставки сразу после создания класса:

class Foo():
     ...

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

Кроме того, вы можете динамически хранить переменную во время создания класса:

class Bar:
    locals()['tx'] = 'texas'
7 голосов
/ 29 ноября 2011

Если по какой-либо причине вы не можете использовать ответ Раймонда об их настройке после создания класса, то, возможно, вы могли бы использовать метакласс:

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()
5 голосов
/ 15 августа 2017

Поздно на вечеринке, но используйте конструктор класса type !

Foo = type("Foo", (), {k: 0 for k in ("tx", "ty", "tz")})
...