Установка атрибута класса с заданным именем в python при определении класса - PullRequest
11 голосов
/ 26 марта 2010

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

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

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

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

Ответы [ 4 ]

13 голосов
/ 16 декабря 2013

Вы можете сделать это еще проще:

class A():
    vars()['key'] = 'value'

В отличие от предыдущего ответа, это решение хорошо работает с внешними метаклассами (например, модели Django).

11 голосов
/ 26 марта 2010

Для этого вам понадобится метакласс:

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
8 голосов
/ 26 марта 2010

Это может быть связано с тем, что класс A не полностью инициализирован, когда вы выполняете там setattr(A, p, v).

Первое, что нужно попробовать, - это просто сдвинуть поселенец вниз после закрытия блока class и посмотреть, работает ли он, например,

<code>class A(object):
    pass</p>

<p>setattr(A, property, value)

В противном случае, то, что Игнасио только что сказал о метаклассах .

0 голосов
/ 19 апреля 2016

Так что я знаю, что это действительно старый и, вероятно, бьет мертвую лошадь, и это, возможно, было невозможно в то время, но я наталкиваюсь на это, пытаясь решить свою собственную проблему.

Я понял, что это можно сделать без метаклассирования.

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
...