Установка атрибута класса с заданным именем в python при определении класса
Вопрос
Я пытаюсь сделать что-то вроде этого:
property = 'name'
value = Thing()
class A:
setattr(A, property, value)
other_thing = 'normal attribute'
def __init__(self, etc)
#etc..........
Но, похоже, я не могу найти ссылку на класс, чтобы получить setattr
работать так же, как просто присваивать переменную в определении класса.Как я могу это сделать?
Решение
Для этого вам нужно будет использовать метакласс:
property = 'foo'
value = 'bar'
class MC(type):
def __init__(cls, name, bases, dict):
setattr(cls, property, value)
super(MC, cls).__init__(name, bases, dict)
class C(object):
__metaclass__ = MC
print C.foo
Другие советы
Вы можете сделать это еще проще:
class A():
vars()['key'] = 'value'
В отличие от предыдущего ответа, это решение хорошо работает с внешними метаклассами (например, модели Django).
Это может быть связано с тем, что класс A
не полностью инициализируется, когда вы выполняете свой setattr(A, p, v)
там.
Первое, что нужно попробовать, это просто переместить settattr вниз на после того, как вы закроете class
заблокируйте и посмотрите, работает ли это, например
class A(object):
pass
setattr(A, свойство, значение)
В противном случае, то , что Игнасио только что сказал о метаклассах.
Итак, я знаю, что это действительно старое и, вероятно, бьющее дохлую лошадь, и, возможно, в то время это было невозможно, но я наткнулся на это, пытаясь решить свою собственную проблему.
Я понял, что это может быть достигнуто без метаклассификации.
setattr принимает объект and, имя средства доступа и значение.Ну, объект - это не имя класса, это конкретный экземпляр класса, который может быть выполнен с помощью self .
class A(object):
def __init__(self):
self.a = 'i am a accessor'
setattr(self, 'key', 'value')
a = A()
print a.a
print a.key