我正在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中是不可能的。"
答案 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