書くべきか
class MyClass:
def __init__(self):
self.field = 0
また
class MyClass:
def __init__(self):
field = 0
これらのステートメントに違いはありますか?
書くべきか
class MyClass:
def __init__(self):
self.field = 0
また
class MyClass:
def __init__(self):
field = 0
これらのステートメントに違いはありますか?
はい、変数を使用してPython オブジェクト/インスタンスのプロパティを設定する必要があります。self
__init__
2 番目のケースでは、プロパティを定義するのではなく、ローカル変数を作成するだけです。
class MyClass:
def __init__(self):
field = 0
print MyClass().field # an error! it's not defined!
class
クラスのプロパティを設定するためにブロック内で生の割り当てを使用できる方法に誤解されるかもしれません。
class MyClass:
a = 2
print MyClass.a # 2
ブロック内の動作class
は異常であり、メソッド内では同様の動作は得られません。
コードの最初のチャンクは、クラスのインスタンスが作成されるとアクセスできるインスタンス属性を作成します。
>>> a = MyClass()
>>> a.field
0
2 番目のチャンクのfield
変数のスコープは関数内のみである__init__
ため、そのスコープ外の変数へのアクセスは機能しません。
>>> a = MyClass()
>>> a.field
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: MyClass instance has no attribute 'field'
前者は値をクラスのプロパティとして設定します。後者は、単にローカル変数として。
プログラムの他の場所で行う場合
foo = MyClass();
print foo.field;
上記の print ステートメントは、最初のコード スニペットでのみ機能し、2 番目のコード スニペットでは機能しません。