我尝试用相同的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
1条答案
按热度按时间gfttwv5a1#
这里我将展示如何访问
D
的子类并应用 Package 器,我假设您希望将所有与@abstractmethod
修饰的方法同名的方法 Package 在D
中。__init_subclass__
在定义D的子类后立即调用,这非常适合此问题。https://docs.python.org/3/reference/datamodel.html#customizing-class-creation
选择要 Package 的方法
@abstractmethod
是一个非常简单的装饰器。它只是向函数添加一个属性并返回它。然后ABCMeta查找这个标记并创建__abstractmethod__
来跟踪它们。创建自己的装饰器并更有选择性地 Package 函数是很简单的。进一步增强
如果直接子类没有实现所有的抽象方法,这个操作将失败。如果处理得当,它仍然不会处理在子类中定义新的抽象方法。