Подтвердить что ты не робот

Установка атрибута класса с заданным именем в python при определении класса

Я пытаюсь сделать что-то вроде этого:

property = 'name'
value = Thing()
class A:
  setattr(A, property, value)
  other_thing = 'normal attribute'

  def __init__(self, etc)
    #etc..........

Но я не могу найти ссылку на класс, чтобы заставить setattr работать так же, как просто присвоение переменной в определении класса. Как я могу это сделать?

4b9b3361

Ответ 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