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

correct way to define class variables in Python

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Variables inside and outside of a class __init__() function

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

第一种方法是这样的:

1
2
3
4
5
6
class MyClass:
  __element1 = 123
  __element2 ="this is Africa"

  def __init__(self):
    #pass or something else

另一种风格是:

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

初始化类属性的正确方法是什么?


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

  • __init__方法之外的元素是静态元素;它们属于类。
  • __init__方法中的元素是对象的元素(self);它们不属于类。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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元素时,这两个对象的类元素都发生了更改。但是,当我们更改对象元素时,另一个对象保持不变。


我认为这个例子解释了两种风格之间的区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
james@bodacious-wired:~$cat test.py
#!/usr/bin/env python

class MyClass:
    element1 ="Hello"

    def __init__(self):
        self.element2 ="World"

obj = MyClass()

print dir(MyClass)
print"--"
print dir(obj)
print"--"
print obj.element1
print obj.element2
print MyClass.element1 +"" + MyClass.element2
james@bodacious-wired:~$./test.py
['__doc__', '__init__', '__module__', 'element1']
--
['__doc__', '__init__', '__module__', 'element1', 'element2']
--
Hello World
Hello
Traceback (most recent call last):
  File"./test.py", line 17, in <module>
    print MyClass.element2
AttributeError: class MyClass has no attribute 'element2'

element1绑定到类,element2绑定到类的实例。