Python中的函数静态成员?
4 个回答
4
这里有一个例子,展示了如何计算同一个类的所有对象被调用的次数:
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
所以你可以通过给出对象的名字或者类的名字来查看这个信息。
5
这里有一个装饰器,可以给一个函数添加计数功能。
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
9
如果你想统计一个方法被调用了多少次,不管是哪个实例调用的,你可以用一个类成员来实现,像这样:
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 会在 Foo.__dict__
中放入一个键值对 ('calls', 0)。
你可以通过 Foo.calls
来访问它。
像 foo=Foo()
这样的 Foo
实例也可以通过 foo.calls
来访问它。
要给 Foo.calls
赋新值,你必须使用 Foo.calls = ...
。
实例不能使用 foo.calls = ...
,因为这样会导致 Python 在 foo.__dict__
中放入一个新的、不同的键值对,而这个地方是用来存放实例成员的。