【问题标题】:Python local variables in methods方法中的 Python 局部变量
【发布时间】:2014-08-15 17:04:22
【问题描述】:

我正在学习 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 方法不会给出像“Unknown variable dog in print”这样的错误。 变量 dog 存在于类之外。

这段代码是如何工作的?这种行为背后的动机是什么?

【问题讨论】:

  • “变量 dog 存在于类外”。是的,这就是该方法不会出错的原因。没有规定说“类中的方法不能看到类外的变量”。

标签: python oop python-3.x


【解决方案1】:

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)

那只是噪音。

【讨论】:

  • @Martijin:这种行为背后的动机是什么?在什么情况下有用?
  • 一个有趣的例子来看看python是如何工作的,但在现实生活中这当然是非常糟糕的编码习惯,只需使用print("I have %s legs" % self.number_of_legs)来打印变量。
  • @vivekratnaparkhi:这很有用,因为您经常需要引用类范围之外的名称,例如导入的模块、内置函数或模块中的其他类。
  • 感谢大家的cmets。我只是好奇为什么允许这样做。
  • @Gio:当然,但是 OP 想知道为什么它起作用了。
猜你喜欢
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 2017-10-27
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多