如何在函数上创建变量?

时间:2014-07-09 16:23:48

标签: python python-2.7 attributes

如何在下面的例子中创建函数变量?任何人都可以在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.

1 个答案:

答案 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__ - 例如,intstr等内置类型的实例都没有,所以你不能为这些添加属性。