Search code examples
pythondecoratorpython-decorators

How can I add a property inside a class decorator?


I'm using a decorator to automatically add serializability to my Python classes. Now I'm wondering, if I could also set a property to the class I want to decorate inside the decorator.


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    


Solution

  • Use setattr(actual_class_type, attribute_name, default_value).

    See the example here: How can I add properties to a class using a decorator that takes a list of names as argument?

    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