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

Gre*_*reg 17 python variables class function

这两个代码块都可以工作.有没有"正确"的方法来做到这一点?

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

myStuff = Stuff(3)
print myStuff.inc()
Run Code Online (Sandbox Code Playgroud)

打印"4"

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

myStuff = Stuff(3)
print myStuff.inc()
Run Code Online (Sandbox Code Playgroud)

还打印"4"

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

谢谢你的帮助!

Joh*_*ooy 12

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

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

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


GoA*_*ats 8

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

class Stuff:
  globx = 0
  def __init__(self, x = 0):
    Stuff.globx = x 
  ...
Run Code Online (Sandbox Code Playgroud)

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

你不应该global为"类范围变量" 使用语句,因为它不是.声明为global全局作用域中的变量,例如定义类的模块的名称空间.

命名空间和相关概念在这里的Python教程中介绍.