При оформлении класса часто бывает полезно или желательно, чтобы оформленное возвращаемое значение также было типом;Наиболее очевидный способ добиться этого - создать декоратор и напрямую вернуть новый класс.
Эта функциональность уже обрабатывается метаклассами;На самом деле, метаклассы немного более мощные, чем декораторы, так как вы можете описать новый класс еще до того, как декорированный класс будет создан.
Другой вариант - вернуть тот же объект, который был передан;но с некоторыми изменениями.Это лучше использовать для декораторов, так как он хорошо работает, когда вы вкладываете декораторы.Поскольку вы изменяете поведение при использовании Foo()
, вы, вероятно, захотите изменить __init__
в Foo, что может выглядеть следующим образом:
>>> def Decorator(cls):
... assert isinstance(cls, type)
... try:
... old_init = cls.__init__.im_func
... except AttributeError:
... def old_init(self): pass
... def new_init(self):
... # do some clever stuff:
... old_init(self)
... cls.__init__ = new_init
... return cls
...
>>> @Decorator
... class Foo(object):
... def __init__(self): pass
...
>>> @Decorator
... class Bar(object):
... pass
...
>>> f = Foo()
>>> isinstance(f, Foo)
True