Python中的静态函数?

时间:2016-10-31 19:12:51

标签: python python-3.x

我正在python中学习OOP并跟随this tutorial。我对这篇文章中的一个例子感到困惑:

def f(x):
    f.counter = getattr(f, "counter", 0) + 1 
    return "Monty Python"


for i in range(10):
    f(i)

print(f.counter)

我有些疑惑。

我知道getattr(f, "counter", 0)做了什么。它为 dict 模块提供了键的可选值。如果属性名称未包含在任一字典中,则不定义属性名称。

首先我认为f.counter = getattr(f, "counter", 0) + 1正在做同样的工作,所以我替换f.counter = getattr(f, "counter", 0) + 1这样:

def f(x):
    count=0
    count+=x
    print(count)

    return "Monty Python"


for i in range(10):
    f(i)


print(count)

它工作正常,但最后一行print(count)给出了错误。所以我的困惑是为什么计数不是全局的,但是当我使用f.counter = getattr(f, "counter", 0) + 1时,f.counter是全局的?

第二个问题是:

文章说

  

"这可以用作静态函数变量的替代   C和C ++,这在Python中是不可能的。"

那么什么叫做静态函数?

2 个答案:

答案 0 :(得分:1)

那是因为您要为f的属性赋值,这是一个全局属性。您对全局对象的属性所做的任何更改都是全局可见的(即使在这种情况下,您的全局对象是一个函数,并且通常不使用函数中的属性)。进行更改后,您在函数范围内创建了一个count变量,因此无法在其外部访问。

答案 1 :(得分:0)

重要的是要注意,每次运行函数时,函数都会创建一个变量count,然后一旦函数退出,count就会消失。您也可以编写如下函数:

def f():
    f.counter = getattr(f, 'counter', 0) + 1

f.counter仍然会保持执行f的次数。我们可以访问f.counter,因为我们可以访问f,而Python中没有任何内容。如果我们尝试在函数外部引用counter,它将是一个NameError,但只是因为它查找它可以找到的每个命名空间,并且没有看到任何名为counter的内容。您必须参考f.counter