1

書くべきか

class MyClass:
     def __init__(self):
         self.field = 0

また

class MyClass:
     def __init__(self):
         field = 0

これらのステートメントに違いはありますか?

4

3 に答える 3

5

はい、変数を使用して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は異常であり、メソッド内では同様の動作は得られません。

于 2012-08-19T00:11:55.033 に答える
3

コードの最初のチャンクは、クラスのインスタンスが作成されるとアクセスできるインスタンス属性を作成します。

>>> 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'
于 2012-08-19T00:13:31.520 に答える
0

前者は値をクラスのプロパティとして設定します。後者は、単にローカル変数として。

プログラムの他の場所で行う場合

foo = MyClass();
print foo.field;

上記の print ステートメントは、最初のコード スニペットでのみ機能し、2 番目のコード スニペットでは機能しません。

于 2012-08-19T00:11:43.510 に答える