对于Python中的类范围变量,我应该使用“global”还是“self”?

2024-06-07 06:27:20 发布

您现在位置:Python中文网/ 问答频道 /正文

这两个代码块都工作。有“正确”的方法吗?

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”

我是个新手,我在一个类中处理很多变量。开始想我为什么要把“自我”摆在眼前。

谢谢你的帮助!


Tags: 方法代码selfreturninitdefglobalclass
3条回答

“类作用域变量”有两种方法。一种是使用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.

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

如果使用全局变量,那么当有多个Stuff实例时,可能会得到令人惊讶的结果,因为更改其中一个实例的值将影响所有其他实例。

在Python代码中到处都是显式self是正常的。如果您尝试一些技巧来避免这一点,那么您将使您的代码难以为其他Python程序员阅读(并且可能会引入额外的bug)

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

全局变量是另一回事。他们是全球性的每个人都有一个。这几乎不是一个好主意(原因在很多场合都有解释),但如果你只是写一个快速而肮脏的脚本,需要在几个地方共享一些东西,它们是可以接受的。

相关问题 更多 >