python 用相同的 Package 器 Package 从抽象类继承的所有子类方法

s71maibg  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(142)

我尝试用相同的exception_wrapper Package 从抽象类(D)继承的所有子类(E,F)方法。
我尝试 Package 抽象类方法,因为子类方法覆盖抽象方法,所以它们没有用exception_wrapper Package 。
我如何 Package 抽象类的所有子类方法而不从子类声明它?

from abc import ABCMeta, abstractmethod
import functools

class D(metaclass=ABCMeta):
    @abstractmethod
    def b(self, **kwargs):
        raise NotImplementedError

def exception_wrapper(func):
    @functools.wraps(func)
    def func_wrapper(self, *args, **kwargs):
        try:
            return func(self, *args, **kwargs)
        except Exception as ex:
            self.loggerservice.info(str(ex))

    return func_wrapper

class E(D):
    @exception_wrapper
    def b(self, **kwargs):
        return 1
gfttwv5a

gfttwv5a1#

这里我将展示如何访问D的子类并应用 Package 器,我假设您希望将所有与@abstractmethod修饰的方法同名的方法 Package 在D中。

class D(metaclass=ABCMeta):
    ...

    def __init_subclass__(cls, **kwargs):
        for name_of_func_to_wrap in D.__abstractmethod__:
            setattr(
                cls,
                name_of_func_to_wrap,
                exception_wrapper(
                    cls.__dict__[name_of_func_to_wrap]
                )
            )

__init_subclass__

在定义D的子类后立即调用,这非常适合此问题。https://docs.python.org/3/reference/datamodel.html#customizing-class-creation

选择要 Package 的方法

@abstractmethod是一个非常简单的装饰器。它只是向函数添加一个属性并返回它。然后ABCMeta查找这个标记并创建__abstractmethod__来跟踪它们。创建自己的装饰器并更有选择性地 Package 函数是很简单的。

进一步增强

如果直接子类没有实现所有的抽象方法,这个操作将失败。如果处理得当,它仍然不会处理在子类中定义新的抽象方法。

相关问题