【问题标题】:Should I be using "global" or "self." for class scope variables in Python?我应该使用“全局”还是“自我”。 Python中的类范围变量?
【发布时间】:2011-03-07 23:26:46
【问题描述】:

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

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”

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

感谢您的帮助!

【问题讨论】:

  • 你应该阅读一些关于 OOP 的介绍。
  • 只要添加第二个实例,这些就不起作用(以相同的方式)...

标签: python class variables function


【解决方案1】:

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

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

在你的 Python 代码中都有显式的 self 是很正常的。如果您尝试一些技巧来避免这种情况,您的代码将难以被其他 Python 程序员阅读(并可能引入额外的错误)

【讨论】:

  • 啊....灯泡亮了!谢谢!在每个示例的 print 语句之前添加“thisStuff = Stuff(5)”后,示例 1 给出“6”,示例 2 仍然给出“4”。再次感谢!
【解决方案2】:

“类范围变量”有两种方式。一种是使用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.

【讨论】:

  • +1 for “全局作用域 = 定义类的模块的命名空间。” 许多人认为全局是函数或类的直接外层空间,即使是嵌套的
  • 糟糕。在您的 __init__() 中,globx 是全局变量,而不是实例变量...[Stuff(1).globx == 0]
【解决方案3】:

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

全局变量是另一回事。它们是全球性的——每个人都有相同的。这几乎不是一个好主意(原因在很多场合都有解释),但如果您只是编写一个快速而肮脏的脚本并且需要在多个地方共享某些内容,那么它们是可以接受的。

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 2010-10-21
    • 2019-01-25
    • 1970-01-01
    • 2013-11-06
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多