可能な重複:
クラス内外の変数__init __()関数
私はPythonでは、人々が2つの異なる方法でクラス属性を初期化することに気づきました。
最初の方法はこのようなものです。
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"
クラス属性を初期化する正しい方法はどれですか。
どちらの方法も必ずしも正しいとか正しくないとは限らず、2つの異なる種類のクラス要素にすぎません。
__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
ご覧のとおり、クラス要素を変更すると、両方のオブジェクトに対して変更されました。しかし、object要素を変更しても、他のオブジェクトは変わりません。
このサンプルはスタイルの違いを説明していると思います。
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はクラスのインスタンスにバインドされます。