为了账号安全,请及时绑定邮箱和手机立即绑定

允许子类指定要在python中装饰的方法

允许子类指定要在python中装饰的方法

翻翻过去那场雪 2021-03-30 21:10:44
我正在干一些带有类代码副本并粘贴的代码。我已将代码分为不同的子类,以实现所需的不同元素,但是代码的残余之一是,每个类的特定装饰器都被称为通用方法。在此示例中,它就是foo方法。@some_decorator_function过去是从每个类的另一个命名空间导入的。现在,装饰器仅从父类中调用一次,因此它不知道用作子类的装饰器需要选择它。有没有办法将要装饰的函数委托给子类?我的想法(并NotImplementedError立即提出,因为对X求值):class X:  def some_decorator_function():    raise NotImplementedError  @some_decorator_function()  def foo(self):    return "Yo!"def concrete_function(func):  passclass Y(X):  def some_decorator_function():    concrete_functionY().foo
查看完整描述

2 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

您可以将装饰器转换为更通用的模式。


def class_defined_decorator(func):

    def wrapper(*args, **kwargs):

        return args[0]._decorator(func, *args, **kwargs)

    return wrapper


class Base(object):

    def _decorator(self, func, *args, **kwargs):

        raise NotImplementedError

    @class_defined_decorator

    def foo(self):

        pass


class Child(Base):

    def _decorator(self, func, *args, **kwargs):

        # Do decorator behavior

        return func(*args, **kwargs)

如果必须支持使用相同的装饰器装饰静态,类和实例方法,则可以通过使装饰器返回描述符来提高想象力。


查看完整回答
反对 回复 2021-04-06
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号