我有一个类使用另一个库中的装饰器来装饰一些方法.具体来说,类子类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)