Python中的一个函数的静态成员?

可能重复:
Python中的静态类变量
什么是函数内部的静态变量的Python等价物?

我如何在Python中使用静态字段?

例如我想要计算函数被调用了多少次 - 我怎么能这样做?


如果你想计算一个方法被调用的次数,不管哪个实例调用它,你都可以使用类成员:

class Foo(object):
    calls=0            # <--- call is a class member
    def baz(self):
        Foo.calls+=1

foo=Foo()
bar=Foo()
for i in range(100): 
    foo.baz()
    bar.baz()
print('Foo.baz was called {n} times'.format(n=foo.calls))
# Foo.baz was called 200 times

以这种方式定义calls

class Foo(object):
    calls=0            

Python将关键值对('calls',0)放在Foo.__dict__

它可以通过 Foo.calls 访问Foo实例,如foo=Foo() ,也可以用foo.calls访问它。

要为Foo.calls 分配新值,您必须使用Foo.calls = ... 实例不能使用foo.calls = ...因为这会导致Python在foo.__dict__放置一个新的,不同的键值对,其中保存了实例成员。


下面是一些计数同一类的所有对象调用次数的示例:

class Swallow():
    i = 0 # will be used for counting calls of fly()
    def fly(self):
        Swallow.i += 1

这就是证明:

>>> a = Swallow()
>>> b = Swallow()
>>> a.fly()
>>> a.i
1
>>> Swallow.i
1
>>> b.fly()
>>> b.i
2
>>> Swallow.i
2

所以你可以通过提供对象名称或类名来读取它。


这是一个将计数添加到函数的装饰器。

import functools

def count_calls(func):
    @functools.wraps(func)
    def decor(*args, **kwargs):
        decor.count += 1
        return func(*args, **kwargs)
    decor.count = 0
    return decor

用法:

>>> @count_calls
... def foo():
...     pass
...
>>> foo.count
0
>>> foo()
>>> foo.count
1
链接地址: http://www.djcxy.com/p/78763.html

上一篇: Static member of a function in Python ?

下一篇: Java stack and heap memory management