草庐IT

decorator

全部标签

Python 动态装饰器——为什么有这么多包装?

所以我对Python装饰器还是有点陌生​​——我以前用过它们,但我从未制作过自己的装饰器。我正在阅读thistutorial(那个特定的段落)我似乎不明白为什么我们需要三层功能?为什么我们不能这样做:defdecorator(func,*args,**kwargs):returnfunc(*args,**kwargs)谢谢:) 最佳答案 好吧,如果你在一个函数上调用那个装饰器会发生什么?@decoratordeffoo():pass这段代码会立即调用foo,这是我们不希望的。装饰器被调用并且它们的返回值替换函数。这和说是一样的def

python - 对函数和方法使用相同的装饰器(带参数)

我一直在尝试创建一个可以与python中的函数和方法一起使用的装饰器。这本身并不难,但是当创建一个带有参数的装饰器时,它似乎很难。classmethods(object):def__init__(self,*_methods):self.methods=_methodsdef__call__(self,func):definner(request,*args,**kwargs):printrequestreturnfunc(request,*args,**kwargs)returninnerdef__get__(self,obj,type=None):ifobjisNone:retur

python - 对函数和方法使用相同的装饰器(带参数)

我一直在尝试创建一个可以与python中的函数和方法一起使用的装饰器。这本身并不难,但是当创建一个带有参数的装饰器时,它似乎很难。classmethods(object):def__init__(self,*_methods):self.methods=_methodsdef__call__(self,func):definner(request,*args,**kwargs):printrequestreturnfunc(request,*args,**kwargs)returninnerdef__get__(self,obj,type=None):ifobjisNone:retur

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

我有一个类使用来自另一个库的装饰器来装饰一些方法。具体来说,该类对flask-restful资源进行子类化,用httpauth.HTTPBasicAuth().login_required()修饰http方法,并对模型服务进行一些合理的默认设置。我希望在大多数子类上应用装饰器;因此我宁愿删除它也不愿将其添加到子类中。我的想法是有一个执行操作的私有(private)方法和一个装饰的公共(public)方法。可以通过覆盖公共(public)方法调用私有(private)方法而不装饰这个覆盖来避免装饰的影响。下面的模拟示例。我很想知道是否有更好的方法来做到这一点。python中是否有“取消装

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

我有一个类使用来自另一个库的装饰器来装饰一些方法。具体来说,该类对flask-restful资源进行子类化,用httpauth.HTTPBasicAuth().login_required()修饰http方法,并对模型服务进行一些合理的默认设置。我希望在大多数子类上应用装饰器;因此我宁愿删除它也不愿将其添加到子类中。我的想法是有一个执行操作的私有(private)方法和一个装饰的公共(public)方法。可以通过覆盖公共(public)方法调用私有(private)方法而不装饰这个覆盖来避免装饰的影响。下面的模拟示例。我很想知道是否有更好的方法来做到这一点。python中是否有“取消装

python - 如何在装饰器中捕获异常但允许调用者也捕获它?

我有一个可能引发异常的python函数。调用者捕获异常并处理它。现在我想向该函数添加一个装饰器,也捕获异常,进行一些处理,然后重新引发异常以允许原始调用者处理它。这是有效的,除了当原始调用者显示来自异常的调用堆栈时,它在装饰器中显示重新引发的行,而不是它最初发生的地方。示例代码:importsys,tracebackdefmydec(func):defdec():try:func()exceptException,e:print'Decoratorhandledexception%s'%eraiseereturndec@mydecdefmyfunc():x=1/0try:myfunc(

python - 如何在装饰器中捕获异常但允许调用者也捕获它?

我有一个可能引发异常的python函数。调用者捕获异常并处理它。现在我想向该函数添加一个装饰器,也捕获异常,进行一些处理,然后重新引发异常以允许原始调用者处理它。这是有效的,除了当原始调用者显示来自异常的调用堆栈时,它在装饰器中显示重新引发的行,而不是它最初发生的地方。示例代码:importsys,tracebackdefmydec(func):defdec():try:func()exceptException,e:print'Decoratorhandledexception%s'%eraiseereturndec@mydecdefmyfunc():x=1/0try:myfunc(

Python装饰器和继承

帮助一个人。似乎无法让装饰器处理继承。将其分解为我的临时工作区中最简单的小示例。似乎仍然无法正常工作。classbar(object):def__init__(self):self.val=4defsetVal(self,x):self.val=xdefdecor(self,func):defincrement(self,x):returnfunc(self,x)+self.valreturnincrementclassfoo(bar):def__init__(self):bar.__init__(self)@decordefadd(self,x):returnx糟糕,名称“decor

Python装饰器和继承

帮助一个人。似乎无法让装饰器处理继承。将其分解为我的临时工作区中最简单的小示例。似乎仍然无法正常工作。classbar(object):def__init__(self):self.val=4defsetVal(self,x):self.val=xdefdecor(self,func):defincrement(self,x):returnfunc(self,x)+self.valreturnincrementclassfoo(bar):def__init__(self):bar.__init__(self)@decordefadd(self,x):returnx糟糕,名称“decor

python - 装饰器与继承

当两者都可能时,您如何决定是使用装饰器还是继承?例如,thisproblem有两个解决方案。我对Python特别感兴趣。 最佳答案 装饰器...:...如果您想做的是“包装”,则应使用。包装包括采取一些东西,修改(或注册它),和/或返回一个行为“几乎完全”与原始对象一样的代理对象。...只要您不创建大量代理对象,就可以应用类似混合的行为。...有一个隐含的“堆栈”抽象:例如@decoA@decoB@decoCdefmyFunc(...):......相当于:defmyFunc(...):......myFunc=decoA(deco