在 Python 类 中使用或不使用 init

To use init or not to in Python classes

我一直为 类 定义变量,例如:

class A():
    def __init__(self):
        self.x = 1

不过,我发现也可以简单地使用:

class A():
    x = 1

在这两种情况下,新实例都会有一个值为 1 的变量 x。

有区别吗?

为了进一步阅读,在 Python Tutorial chapter on classes 中详细讨论了该问题。摘要如下:

一旦非不可变数据结构参与游戏,就会有所不同。

>>> class A:
...   x = [1]
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.x.append(2)
>>> a1.x
[1, 2]
>>> a2.x
[1, 2]

在这种情况下,x 的同一个实例用于两个 class 实例。使用__init__时,创建新的A实例时会创建新的实例:

>>> class A:
...   def __init__(self):
...     self.x = [1]
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.x.append(2)
>>> a1.x
[1, 2]
>>> a2.x
[1]

在第一个示例中,创建了一个列表并将其绑定到 A.x。这可以使用 A.xA().x 访问(对于任何 A(),例如 a1a2)。他们都共享同一个列表对象。

在第二个示例中,A 没有属性 x。相反,对象在初始化期间接收一个属性 x,每个对象都是不同的。

你的问题很不准确。你说 "variables for classes",但后来你说 "instance will have a variable"。事实上,你的例子是相反的。 第二个显示一个带有变量x的class A,第一个显示一个没有变量的class A x,但其每个实例(在 __init__ 之后,除非删除)都有一个变量 x.

如果值是不可变的,则没有太大区别,因为当您有 a=A() 而 a 没有变量 x 时,a.x 会自动委托给 A.x。但是,如果该值是可变的,那么它很重要,因为在第二个示例中只有 one x,并且 xs 与实例(零,一,二,十七,。 ..) 在第一个。