7

私はC++のバックグラウンドからPythonに来ています

私はメンバー変数を宣言し、次のようにC++esqeの方法で設定しています。

class MyClass:
    my_member = []

    def __init__(self,arg_my_member):
        self.my_member = arg_my_member

次に、いくつかのオープンソースコードで、最初の宣言my_member = []が完全に省略され、コンストラクターでのみ作成されていることに気付きました。

Pythonは動的であるため、これは明らかに可能です。

私の質問は、これは物事を行うための好ましい方法ですか、それともPythonicの方法ですか、そしてどちらの長所と短所がありますか?

4

4 に答える 4

9

これを行う方法は、同じ名前の「静的」メンバーと「非静的」メンバーを持つことを意味します。

class MyClass:
    my_member = []

    def __init__(self, arg_my_member):
        self.my_member = arg_my_member


>>> a = MyClass(42)
>>> print a.my_member
42
>>> print MyClass.my_member
[]
于 2010-07-24T10:35:00.530 に答える
4

クラス内で定義する場合はクラス変数であり、コンストラクター内で定義する場合はオブジェクト変数です。したがって、コンストラクター内で定義しない場合、クラスのすべてのインスタンスは同じクラス変数を共有します。

于 2010-07-24T10:31:11.053 に答える
1

可変値の場合を除いて、Pythonでは両方の方法を使用できます。あなたの例のようにそれを宣言するとき、あなたは非常に予想外の結果を得ることができます:

>>> class MyClass:
...     my_member = []
... 
>>> A = MyClass()
>>> B = MyClass()
>>> A.my_member.append(1)
>>> A.my_member
[1]
>>> B.my_member.append(2)
>>> B.my_member
[1, 2]
>>> A.my_member
[1, 2]
>>> MyClass.my_member
[1, 2]

クラスメンバーは一度だけ生成されるため、クラス自体がモジュールのロード時に処理されているとき。メンバーをインスタンススコープで使用する場合は、次のように設定する必要があります。__init__

不変の値は問題ありません。

于 2010-07-24T11:15:12.150 に答える
0

これにより、my_memberというクラス属性が作成されます

class MyClass:
    my_member = []

インスタンスにmy_memberというインスタンス変数がない場合、すべてのインスタンスは。を介して同じリストにアクセスできますself.my_member

と呼ばれるインスタンス変数を作成しているためmy_member、クラス変数が使用されることはなく、混乱の兆候である可能性が非常に高くなります。

于 2010-07-24T10:33:09.160 に答える