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