在python中,有两种方法来声明装饰者:
基于类的
class mydecorator(object):
def __init__(self, f):
self.f = f
def __call__(self, *k, **kw):
# before f actions
self.f(*k, **kw)
# after f actions基于函数的
def mydecorator(f):
def decorator(*k, **kw):
# before f actions
f(*k, **kw)
# after f actions
return decorator 这些声明之间有什么区别吗?在哪种情况下,每一种都应该使用?
发布于 2011-07-13 08:57:13
如果要将状态保持在装饰符中,则应该使用类。
例如,这不起作用。
def mydecorator(f):
x = 0
def decorator():
x += 1 # x is a nonlocal name and cant be modified
return f(x)
return decorator 有很多解决方法,但最简单的方法是使用类。
class mydecorator(object):
def __init__(self, f):
self.f = f
self.x = 0
def __call__(self, *k, **kw):
self.x += 1
return f(self.x)发布于 2011-07-13 10:31:49
当您创建一个可调用的返回另一个可调用的函数时,函数方法更容易、更便宜。有两个主要区别:
__get__方法。此外,函数方法允许您在修改或存储原始函数之后返回它。
但是,装饰师可以返回可调用的或更多的可调用的东西。有了一门课,你可以:
将方法和属性添加到修饰的可调用对象中,或对其实现(uh-oh).
property)
如果你有任何疑问,扪心自问:你想让你的装饰师返回一个功能和函数完全一样的函数吗?使用返回函数的函数。您希望您的装饰器返回一个自定义对象,该对象可以执行更多的任务,还是与函数的功能不同?创建一个类并将其用作装饰器。
发布于 2011-07-13 08:46:01
事实上,没有“两种方式”。只有一种方法(定义一个可调用的对象)或python中生成可调用对象的方式一样多(它可以是其他对象的一个方法,一个lambda表达式的结果,一个“部分”对象,任何可调用的东西)。
函数定义是创建可调用对象的最简单方法,而且作为最简单的方法,在大多数情况下可能是最好的。使用类为您提供了更多的可能性,可以清晰地编写更复杂的案例(即使在最简单的情况下,它看起来相当优雅),但它所做的事情并不明显。
https://stackoverflow.com/questions/6676015
复制相似问题