在Python类中使用init或不使用init

在Python类中使用init或不使用init,python,class,init,Python,Class,Init,我总是为类定义变量,例如: class A(): def __init__(self): self.x = 1 但是,我发现也可以简单地使用: class A(): x = 1 在这两种情况下,新实例都将有一个值为1的变量x 有什么不同吗?为了进一步阅读,在中,将详细讨论这一问题。摘要如下: 一旦非不变的数据结构参与到游戏中,就会出现差异 >>> class A: ... x = [1] ... >>> a1 = A(

我总是为类定义变量,例如:

class A():
    def __init__(self):
        self.x = 1
但是,我发现也可以简单地使用:

class A():
    x = 1
在这两种情况下,新实例都将有一个值为1的变量x


有什么不同吗?

为了进一步阅读,在中,将详细讨论这一问题。摘要如下:

一旦非不变的数据结构参与到游戏中,就会出现差异

>>> class A:
...   x = [1]
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.x.append(2)
>>> a1.x
[1, 2]
>>> a2.x
[1, 2]
在这种情况下,两个类实例使用相同的x实例。使用_uinit _;时,创建新实例时会创建新实例:

>>> 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,该属性对于每个对象都是不同的。

为了进一步阅读,在中,将详细讨论该问题。摘要如下:

一旦非不变的数据结构参与到游戏中,就会出现差异

>>> class A:
...   x = [1]
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.x.append(2)
>>> a1.x
[1, 2]
>>> a2.x
[1, 2]
在这种情况下,两个类实例使用相同的x实例。使用_uinit _;时,创建新实例时会创建新实例:

>>> 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,该属性对于每个对象都是不同的。

您的问题非常不精确。您谈到类的变量,但稍后您会说实例将有一个变量。事实上,你的例子正好相反。第二个显示的是一个带有变量x的类a,第一个显示的是一个没有变量x的类a,但其在_init__;之后的每个实例都有一个变量x,除非已删除


如果该值是不可变的,则没有太大区别,因为当a=a且a没有变量x时,a.x会自动委托给a.x。但如果该值是可变的,那么它就很重要,因为在第二个示例中只有一个x,并且实例的数量等于零、一、二、十七,。。。在第一个问题中。

你的问题很不精确。您谈到类的变量,但稍后您会说实例将有一个变量。事实上,你的例子正好相反。第二个显示的是一个带有变量x的类a,第一个显示的是一个没有变量x的类a,但其在_init__;之后的每个实例都有一个变量x,除非已删除


如果该值是不可变的,则没有太大区别,因为当a=a且a没有变量x时,a.x会自动委托给a.x。但如果该值是可变的,那么它就很重要,因为在第二个示例中只有一个x,并且实例的数量等于零、一、二、十七,。。。在第一个列表中。

尝试使用类似列表的方式来执行此操作。看看你是否能发现区别。在第一个代码片段中,x是一个实例成员,在第二个代码片段中,x是类成员。试着用类似于列表的东西来实现这一点。看看你是否能发现区别。在第一个代码片段中,x是实例成员,在第二个代码片段中,x是类成员。所以在更简单的情况下,类的所有实例都会共享一个列表?这真的让你觉得。。。您是否曾专门使用它在实例之间共享列表?@PascalvKooten您可以这样做,这取决于用例是否合理。我想不起来曾经专门用列表或任何其他可变数据结构做过这件事。这并不意味着我没有这么做。很好,我很高兴我问了,很高兴知道这样的事情存在!尝试检查A、a1和a2的uuu目录,以查看x存储在何处,以及通过A.x=。。。或a1.x=。。。。基本上,分配给a1.x将导致a1为x存储某些内容,这将隐藏其类的x字段。当x持有一个可变对象时,您可能不会执行这样的赋值,因此您最终会使用一个在所有实例之间共享的对象。那么在更简单的情况下,一个列表将在类的所有实例之间共享?这真的让你觉得。。。您是否曾专门使用它在实例之间共享列表?@PascalvKooten您可以这样做,这取决于用例是否合理。我想不起来曾经专门用列表或任何其他可变数据结构做过这件事。这并不意味着我没有这么做。很好,我很高兴我问了,很高兴知道这样的事情存在!尝试检查A、a1和a2的uuu目录,以查看x存储在何处,以及通过A.x=。。。或a1.x=。。。。基本上,分配给a1.x将导致a1为x存储某些内容,这将隐藏其类的x字段。当x持有可变对象时,您可能不会执行su 设置一个赋值,这样您就可以使用一个在所有实例中共享的对象。