方法中的Python局部变量

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)

那只是噪音.