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

Трябва да направя куп променливи на класа и бих искал да го направя, като превъртя списък като този:

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

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

възможно ли е? Не искам да ги правя за пример (използвайки self в __init__), а като променливи на класа.


person pawel    schedule 29.11.2011    source източник
comment
Защо да не ги задържим в dict?   -  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