在 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.x
和 A().x
访问(对于任何 A()
,例如 a1
或 a2
)。他们都共享同一个列表对象。
在第二个示例中,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 与实例(零,一,二,十七,。 ..) 在第一个。
我一直为 类 定义变量,例如:
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.x
和 A().x
访问(对于任何 A()
,例如 a1
或 a2
)。他们都共享同一个列表对象。
在第二个示例中,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 与实例(零,一,二,十七,。 ..) 在第一个。