Как я могу добавить свойство внутри декоратора класса? - PullRequest
0 голосов
/ 19 июня 2019

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


def serialize(clazz):
  def inner(actual_class_type):
    actual_init = actual_class_type.__init__

    def new_init(self, *args, **kwargs):
      cool_thing = clazz()

      # do stuff

      actual_init(self, *args, **kwargs)

    actual_class_type.__init__ = new_init

    return actual_class_type

  return inner    

1 Ответ

1 голос
/ 19 июня 2019

Использование setattr(actual_class_type, attribute_name, default_value).

Смотрите пример здесь: Как я могу добавить свойства в класс, используя декоратор, который принимает список имен в качестве аргумента?

def serialize(clazz):
  def inner(actual_class_type):
    actual_init = actual_class_type.__init__

    def new_init(self, *args, **kwargs):
      cool_thing = clazz()

      # do stuff

      actual_init(self, *args, **kwargs)

    actual_class_type.__init__ = new_init

    prop_name = "my_prop"
    def getAttr(self):
      return getattr(self, "_" + prop_name)
    def setAttr(self, value):
      setattr(self, "_" + prop_name, value)
    prop = property(getAttr, setAttr)
    setattr(cls, prop_name, prop)
    setattr(cls, "_" + prop_name, None) # Default value for that property

    return actual_class_type

  return inner   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...