как динамически создать переменную класса в python

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

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

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

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


person pawel    schedule 29.11.2011    source источник
comment
Почему бы не держать их в дикте?   -  person DrTyrsa    schedule 29.11.2011
comment
Вы хотите поделиться этими переменными между разными экземплярами?   -  person luc    schedule 29.11.2011
comment
Точно сказать не могу. вероятно. требование исходит от API, и я не знаю, как они там используются.   -  person pawel    schedule 29.11.2011


Ответы (4)


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

class Foo():
     ...

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

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

class Bar:
    locals()['tx'] = 'texas'
person Raymond Hettinger    schedule 29.11.2011
comment
ах. это классно. Я попробую и посмотрю, справится ли с этим API, с которым я работаю. Спасибо друг! - person pawel; 29.11.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()
person Duncan    schedule 29.11.2011
comment
Это не сработает, так как ваше решение жестко закодировало значения для _extra_vars. - person MSS; 20.05.2021
comment
@MSS вам не нужно использовать 'tx ty tz'.split(), вы можете заменить свое собственное выражение, которое может ссылаться на переменную. - person Duncan; 20.05.2021

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

Foo = type("Foo", (), {k: 0 for k in ("tx", "ty", "tz")})
person costrouc    schedule 15.08.2017

Версия locals() у меня не работала в классе.

Для динамического создания атрибутов класса можно использовать следующее:

class namePerson:
    def __init__(self, value):
        exec("self.{} = '{}'".format("name", value)

me = namePerson(value='my name')
me.name # returns 'my name'
person Frederick Chesneau    schedule 09.11.2019