小编Jot*_*loo的帖子

是否有一种pythonic方法可以在子类的方法上跳过装饰?

我有一个类使用另一个库中的装饰器来装饰一些方法.具体来说,类子类flask-restful资源,用http修饰http方法httpauth.HTTPBasicAuth().login_required(),并在模型服务上做一些明智的默认设置.

在大多数子类中,我希望应用装饰器; 因此我宁愿删除它而不是在子类中添加它.

我的想法是拥有一个执行操作的私有方法和一个装饰的公共方法.通过重写公共方法来调用私有方法而不是装饰此覆盖,可以避免装饰的影响.下面的模拟示例.

我很想知道是否有更好的方法来做到这一点.在python中有"取消装饰器"的快捷方式可以产生这种效果吗?

或者你能推荐一个更好的方法吗?

其他一些问题对此有合适的答案,例如,是否有办法获得装饰者包裹的功能?.但我的问题是更广泛的设计 - 我感兴趣的任何 pythonic方式在装饰方法中运行操作没有装饰的影响.例如,我的例子是这样的,但可能还有其他的.

def auth_required(fn):
    def new_fn(*args, **kwargs):
        print('Auth required for this resource...')
        fn(*args, **kwargs)
    return new_fn

class Resource:
    name = None

    @auth_required
    def get(self):
        self._get()

    def _get(self):
        print('Getting %s' %self.name)

class Eggs(Resource):
    name = 'Eggs'

class Spam(Resource):
    name = 'Spam'

    def get(self):
        self._get()
        # super(Spam, self)._get()

eggs = Eggs()
spam = Spam()

eggs.get()
# Auth required for this resource...
# Getting Eggs

spam.get()
# Getting Spam
Run Code Online (Sandbox Code Playgroud)

python decorator flask flask-restful

15
推荐指数
1
解决办法
367
查看次数

标签 统计

decorator ×1

flask ×1

flask-restful ×1

python ×1