viv*_*khi 3 python oop python-3.x
我正在学习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()
Run Code Online (Sandbox Code Playgroud)
此代码打印:
I have 4 legs
Run Code Online (Sandbox Code Playgroud)
为什么count_legs方法不会出现"打印中的未知变量狗"这样的错误.变量狗存在于课外.
这段代码是如何工作的?这种行为背后的动机是什么?
Mar*_*ers 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
Run Code Online (Sandbox Code Playgroud)
这样可以很容易地引用模块中稍后定义的其他全局变量; 这包括递归函数:
def fib(n):
if n <= 1: return n
return fib(n - 1) + fib(n - 2)
Run Code Online (Sandbox Code Playgroud)
当定义fib()没有全局名称fib 尚未 ; 只有在创建了功能对象时才添加全局.如果该名称必须存在,第一,你会最终类似的代码:
fib = None # placeholder for global reference
def fib(n):
if n <= 1: return n
return fib(n - 1) + fib(n - 2)
Run Code Online (Sandbox Code Playgroud)
那只是噪音.