如何在下面的例子中创建函数变量?任何人都可以在wrapper.count
中解释这种可能性吗?
def logging_decorator(func):
def wrapper():
wrapper.count += 1
print "The function I modify has been called {0} times(s).".format(
wrapper.count)
func()
wrapper.count = 0
return wrapper
def a_function():
print "I'm a normal function."
modified_function = logging_decorator(a_function)
modified_function()
# >> The function I modify has been called 1 time(s).
# >> I'm a normal function.
modified_function()
# >> The function I modify has been called 2 time(s).
# >> I'm a normal function.
答案 0 :(得分:1)
Python是一种面向对象的语言 - 一个函数只是另一个对象实例*(也称为“第一类对象” - 见this question):
>>> def myfunc():
pass
>>> type(myfunc)
<type 'function'>
并且其属性为__dict__
:
>>> myfunc.__dict__
{}
因此,您可以向函数添加属性,就像使用__dict__
**的任何其他类实例一样:
>>> myfunc.foo = "bar"
>>> myfunc.__dict__
{'foo': 'bar'}
另一个例子是经典的memoizer,其中cache
字典属性被添加到装饰器返回的函数中:
def memoize(f):
def func(*args):
if args not in func.cache:
func.cache[args] = f(*args)
return func.cache[args]
func.cache = {}
return func
* 内置函数<type 'builtin_function_or_method'>
不是这样 - 例如,您无法将属性添加到max
。
** 并非所有实例都有__dict__
- 例如,int
和str
等内置类型的实例都没有,所以你不能为这些添加属性。