我应该使用“全球”还是“自我”。对于Python中的类范围变量?

时间:2011-03-07 23:26:47

标签: python class variables function

这两个代码块都有效。有没有“正确”的方法来做到这一点?

class Stuff:
    def __init__(self, x = 0):
        global globx
        globx = x
    def inc(self):
        return globx + 1

myStuff = Stuff(3)
print myStuff.inc()

打印“4”

class Stuff:
    def __init__(self, x = 0):
        self.x = x
    def inc(self):
        return self.x + 1

myStuff = Stuff(3)
print myStuff.inc()

还打印“4”

我是一个菜鸟,我在课堂上处理很多变量。开始想知道为什么我把“自我”。在一切可见的面前。

感谢您的帮助!

3 个答案:

答案 0 :(得分:10)

您应该使用第二种方式,然后每个实例都有一个单独的x

如果您使用全局变量,那么当您拥有多个Stuff实例时,您可能会发现获得惊人的结果,因为更改一个实例会影响所有其他实例。

在Python代码中拥有明确的自我是正常的。如果您试图避免这种情况,那么您将难以为其他Python程序员阅读代码(并可能引入额外的错误)

答案 1 :(得分:8)

“类范围变量”有两种方法。一种是使用self,这称为实例变量,一个类的每个实例都有自己的实例变量副本;另一个是在类定义中定义变量,这可以通过以下方式实现:

class Stuff:
  globx = 0
  def __init__(self, x = 0):
    Stuff.globx = x 
  ...

这称为类属性,可以由Stuff.globx直接访问,并由类拥有,而不是类的实例,就像Java中的静态变量一样。

你永远不应该将global语句用于“类范围变量”,因为它不是。声明为global的变量位于全局范围内,例如定义类的模块的命名空间。

namespace and related concept is introduced in the Python tutorial here.

答案 2 :(得分:1)

那些非常在语义上是不同的。 self.表示它是一个实例变量,即每个实例都有自己的实例变量。这可能是最常见的类型,但不是唯一的类型。然后是类变量,在类级别定义(因此在执行类定义时),并且可以在类方法中访问。相当于大多数静态方法的使用,最可能的是当你需要在实例之间共享东西时你想要的东西(这是完全有效的,尽管不是自动的,只针对给定的问题)。你可能想要其中一个,这取决于你正在做什么。真的,我们无法读懂你的想法并告诉你哪一个适合你的问题。

全球变量是另一回事。他们是,全球 - 每个人都有相同的。这几乎从来都不是一个好主意(出于多次解释的原因),但如果你只是编写一个快速而肮脏的脚本并需要在几个地方之间分享,那么它们是可以接受的。