【问题标题】:Combining abc.abstractmethod with other decorators将 abc.abstractmethod 与其他装饰器相结合
【发布时间】:2016-05-03 09:47:00
【问题描述】:

假设我有一个类似如下的课程:

from functools import wrap
import abc

class Test:
    def hello (self):
        print("hello world!")

    def decorator (f):
        @wraps(f)
        def wrapped (inst, *args, **kwargs):
            inst.hello()
            return f(inst, *args, **kwargs)
        return wrapped

    @abc.abstractmethod
    # @decorator ???
    def fn (self):
        return

有什么方法可以确保抽象方法 fn() 的所有实现都使用 decorator() 进行修饰?通过强制实现显式包含装饰,或者通过自动装饰所有实现。

【问题讨论】:

    标签: python python-3.x decorator python-decorators


    【解决方案1】:

    没有。 ABC 只能指示某些属性存在,无论是作为方法还是属性。他们没有能力决定使用装饰器。

    ABC 指定接口,而不是实现;装饰器是一个实现细节。

    【讨论】:

    • 谢谢。假设我有一个装饰器,任何实现都必须使用它才能正常工作。有没有一种简洁的方法来强制使用它?这是否表明设计不佳?在文档字符串中留下评论说“在你的实现中使用这个装饰器!”唯一的办法?
    • @Pig:没有。 Python 并不是一种真正执行此类实现细节的语言。记录并相信人们会阅读。如果您不信任 API 的用户,您可以提供工具来测试代码(如 linter)或在运行时测试特定装饰器提供的标志。
    • 这是一个个人项目,但我认为如果我能达到这个效果,它会减少代码重复。感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2017-03-27
    • 2021-01-06
    • 2020-02-10
    • 2021-05-15
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多