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绑定到类的实例。