我有一个类装饰器
p()
,它只能用于从某个抽象类继承的类P
。
所以任何时候有人使用
p
时都应该写成如下:
@p()
class Child(P):
...
有没有办法使用装饰器p()自动继承P,所以它会简单地写成如下:
@p()
class Child:
...
正如我所评论的,按照您要求的方式使用装饰器应用基类是很棘手的。然而,如果您尝试另一种方法,将装饰器的行为合并到基类中,而不是相反,那就容易多了。
这是一个示例,在调用子类的
__init__
方法之前打印出一条消息:
from functools import wraps
class Base:
def __init_subclass__(cls):
original_init = cls.__init__
@wraps(cls.__init__)
def wrapper(self, *args):
print("foo")
original_init(self, *args)
cls.__init__ = wrapper
class Derived(Base):
def __init__(self):
print("bar")
您可以自定义包装函数的行为来执行装饰器当前执行的任何操作(而不仅仅是打印消息)。当然,基础类可以具有您希望派生类继承的任何行为,而不仅仅是能够更改子类的
__init_subclass__
方法的 __init__
机制。