微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

装饰抽象方法

如何解决装饰抽象方法

我正在尝试在抽象类中装饰一个 @abstractmethod(在 Python 3.9 中由 abc.ABC 继承)

作为 MWE,

from abc import ABC,abstractmethod

class Block(ABC):

    def __init__(self,id=1):
        self.id=id

    @abstractmethod # the method I want to decorate
    def run(self):
        pass

    def store_id(self,fun): # the decorator I want to apply to run()
        def wrapper(fun):
            id=fun()
            self.id=id
            return id
        return wrapper

class Example(Block):

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

    def run(self):
        print("I am running")
        id=3
        return id

t=Example()
t.run()
print(t.id)

我想修饰 run() 以便返回的 id 可以存储在对象中,而无需最终用户对其进行硬编码。

我正在寻找这个问题的解决方案,最完整的是this one

__init_subclass__ 魔术方法似乎是我在 store_id 中使用 Block 方法在具体实现后装饰 run() 的最佳镜头。

但是,如果我像这样覆盖 __init_subclass__ 中的 Block

def __init_subclass__(self):
        super().__init_subclass__()
        self.run = self.store_id(self.run)

我收到一个TypeError,但不知道如何解决TypeError: store_id() missing 1 required positional argument: 'fun'

我是否以正确的方式解决了这个问题?我是否遗漏了一些基本的 a 或与“abc”类型的类有关的东西?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。