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

StackOverflow https://stackoverflow.com/questions/2519807

  •  22-09-2019
  •  | 
  •  

Вопрос

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top