Python中的函数静态成员?

38 投票
4 回答
4096 浏览
提问于 2025-04-17 06:13

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

我该如何在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__ 中放入一个新的、不同的键值对,而这个地方是用来存放实例成员的。

撰写回答