我正在学习Python 3,我在Python中有关于面向对象编程的基本问题。这是我的代码。
class pet:
number_of_legs = 0
def count_legs(self):
print("I have %s legs" %dog.number_of_legs)
dog = pet()
dog.number_of_legs = 4
dog.count_legs()
此代码打印:
I have 4 legs
为什么count_legs方法不会出现类似"未知变量狗的错误。" 变量狗存在于课外。
此代码的工作原理如何?这种行为背后的动机是什么?
答案 0 :(得分:10)
dog
在运行时被查找为全局 ;如果您以不同的方式命名变量, 会抛出错误:
>>> class pet:
... number_of_legs = 0
... def count_legs(self):
... print("I have %s legs" %dog.number_of_legs)
...
>>> cat = pet()
>>> cat.number_of_legs = 4
>>> cat.count_legs()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in count_legs
NameError: name 'dog' is not defined
>>> dog = cat
>>> cat.count_legs()
I have 4 legs
这样可以很容易地引用以后定义的模块中的其他全局变量;这个包含递归函数:
def fib(n):
if n <= 1: return n
return fib(n - 1) + fib(n - 2)
定义fib()
时,没有全局名称fib
尚未;只有在创建了功能对象时才添加全局。如果名称必须存在 first ,您最终会得到如下代码:
fib = None # placeholder for global reference
def fib(n):
if n <= 1: return n
return fib(n - 1) + fib(n - 2)
那只是噪音。