使用装饰器自动继承父类

问题描述 投票:0回答:1

我有一个类装饰器

p()
,它只能用于从某个抽象类继承的类
P

所以任何时候有人使用

p
时都应该写成如下:

@p()
class Child(P):
    ...

有没有办法使用装饰器p()自动继承P,所以它会简单地写成如下:

@p()
class Child:
    ...
python class inheritance python-decorators
1个回答
0
投票

正如我所评论的,按照您要求的方式使用装饰器应用基类是很棘手的。然而,如果您尝试另一种方法,将装饰器的行为合并到基类中,而不是相反,那就容易多了。

这是一个示例,在调用子类的

__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__
机制。

© www.soinside.com 2019 - 2024. All rights reserved.