在Python中定义类变量的正确方法


问题内容

这个问题已经在这里有了答案

8年前关闭。

可能重复:
类__init
__()函数内部和外部的变量

我注意到在Python中,人们以两种不同的方式初始化其类属性。

第一种方式是这样的:

class MyClass:
  __element1 = 123
  __element2 = "this is Africa"

  def __init__(self):
    #pass or something else

其他样式如下:

class MyClass:
  def __init__(self):
    self.__element1 = 123
    self.__element2 = "this is Africa"

初始化类属性的正确方法是哪种?


问题答案:

两种方法都不一定正确或不正确,它们只是两种不同的类元素:

  • __init__方法外的元素是静态元素;他们属于阶级。
  • 内部元件__init__方法是对象的元件(self); 他们不属于这个阶级。

您将通过一些代码更清楚地看到它:

class MyClass:
    static_elem = 123

    def __init__(self):
        self.object_elem = 456

c1 = MyClass()
c2 = MyClass()

# Initial values of both elements
>>> print c1.static_elem, c1.object_elem 
123 456
>>> print c2.static_elem, c2.object_elem
123 456

# Nothing new so far ...

# Let's try changing the static element
MyClass.static_elem = 999

>>> print c1.static_elem, c1.object_elem
999 456
>>> print c2.static_elem, c2.object_elem
999 456

# Now, let's try changing the object element
c1.object_elem = 888

>>> print c1.static_elem, c1.object_elem
999 888
>>> print c2.static_elem, c2.object_elem
999 456

如您所见,当我们更改class元素时,这两个对象都发生了变化。但是,当我们更改对象元素时,另一个对象保持不变。