Установка атрибута класса с заданным именем в python при определении класса
Я пытаюсь сделать что-то вроде этого:
property = 'name'
value = Thing()
class A:
setattr(A, property, value)
other_thing = 'normal attribute'
def __init__(self, etc)
#etc..........
Но я не могу найти ссылку на класс, чтобы заставить setattr
работать так же, как просто присвоение переменной в определении класса. Как я могу это сделать?
Ответы
Ответ 1
Для этого вам необходимо использовать метакласс:
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
Ответ 2
Вы можете сделать это еще проще:
class A():
vars()['key'] = 'value'
В отличие от предыдущего ответа, это решение хорошо сочетается с внешними метаклассами (например, для моделей Django).
Ответ 3
Это может быть связано с тем, что класс A
не полностью инициализирован, когда вы выполняете свой setattr(A, p, v)
.
Первое, что нужно попробовать, - просто переместить setattr вниз после закрытия блока class
и посмотреть, работает ли это, например.
class A(object):
pass
setattr(A, property, value)
В противном случае то, что Игнасио только что сказал о метаклассах.
Ответ 4
Итак, я знаю, что это действительно старо и, вероятно, избивает мертвую лошадь, и это может быть не возможно в то время, но я участвую в этом, пытаясь решить мою собственную проблему.
Я понял, что это может быть достигнуто без метаклассификации.
Задает setattr и объект, имя и значение аксессора. Ну, объект не является именем класса, это конкретный экземпляр класса, который может быть выполнен с помощью 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