向抽象方法添加装饰器

2024-10-02 22:29:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在abstractmethod上添加decorator,这样当在子类中调用该方法时,也会调用decorator函数。这是针对一个框架的,所以我试图限制以后用户必须编写的额外代码的数量。decorator非常特定于框架,不适合框架的一般用户使用-希望这是有意义的

我知道还有其他一些方法可以做到这一点,但大多数方法都涉及到用户在创建自己的子类时复制一些样板代码。装饰师有助于避免复制样板文件

from abc import abstractmethod, ABC

def prepost(fn):
    # The new function the decorator returns
    def wrapper(*args, **kwargs):
        print("In wrap 1")
        fn(*args, **kwargs)
        print("In wrap 2")
        return
    wrapper.__isabstractmethod__ = True
    return wrapper

class Base(ABC):
    pass

class Foo(Base):
    @prepost
    @abstractmethod
    def dosomething(self):
        raise NotImplementedError

class Bar(Foo):
    def dosomething(self):
        print("I'm doing something")

Test = Bar()
Test.dosomething()

当我尝试这个时,我得到: 我在做点什么

而不是装饰器的额外输出


Tags: 方法代码用户框架defdecorator样板wrapper