gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:07:28 26 4
gpt4 key购买 nike

我有一个类使用来自另一个库的装饰器来装饰一些方法。具体来说,该类对 flask-restful 资源进行子类化,用 httpauth.HTTPBasicAuth().login_required() 修饰 http 方法,并对模型服务进行一些合理的默认设置。

我希望在大多数子类上应用装饰器;因此我宁愿删除它也不愿将其添加到子类中。

我的想法是有一个执行操作的私有(private)方法和一个装饰的公共(public)方法。可以通过覆盖公共(public)方法调用私有(private)方法而不装饰这个覆盖来避免装饰的影响。下面的模拟示例。

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

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

其他一些问题对此有合适的答案,例如Is there a way to get the function a decorator has wrapped? .但我的问题是关于更广泛的设计——我对任何 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

最佳答案

Flask-HTTPAuth使用 functools.wrapslogin_required 装饰器中:

def login_required(self, f):
@wraps(f)
def decorated(*args, **kwargs):
...

从 Python 3.2 开始,调用 update_wrapper ,您可以通过 __wrapped__ 访问原始函数:

To allow access to the original function for introspection and other purposes (e.g. bypassing a caching decorator such as lru_cache()), this function automatically adds a __wrapped__ attribute to the wrapper that refers to the function being wrapped.

如果您正在编写自己的装饰器,如您的示例所示,您也可以使用 @wraps 来获得相同的功能(以及保留文档字符串等)。

另见 Is there a way to get the function a decorator has wrapped?

关于python - 是否有一种 pythonic 方法可以跳过子类方法的装饰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35165669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com