0

クラスを持つ

class A(object):
    z = 0

    def Func1(self):
        return self.z

    def Func2(self):
        return A.z

両方の方法(Func1およびFunc2)は同じ結果をもたらし、アドレス指定方法の2つの可能な方法を説明するためにこの人工的な例にのみ含まれていますz

の結果は、インスタンスが。のようなものでFunc*シャドウイングされる場合にのみ異なります。zself.z = None

またはzの構文を使用してクラス変数にアクセスするための適切なPythonの方法は何ですか?Func1Func2

4

3 に答える 3

3

変数にアクセスするための適切な方法は、次のとおりです。

a_instance.z  #instance variable 'z'
A.z           #class variable 'z'

ここは必要ありませFunc1Func2


ちなみに、もしあなたが書く必要Func2があるなら、それはclassmethod適切かもしれないようです:

@classmethod
def Func2(cls):
    return cls.z

最後に、メソッド内で使用するバージョン(self.zvs. A.zvs. cls.zwith classmethod)は、APIの動作方法によって異なります。A.zインスタンス属性を設定して、ユーザーがシャドウできるようにしますzか?その場合は、を使用しますself.z。そのシャドウイングが必要ない場合は、を使用できますA.z。メソッドは必要selfですか?そうでない場合は、おそらくクラスメソッドなどです。

于 2012-11-19T13:50:04.420 に答える
1

self.z値が異なるサブクラスがある場合zは「正しい」ものを選択するため、通常はを使用します。そうしない唯一の理由は、それにAもかかわらず、常にバージョンが必要になることがわかっている場合です。

selfまたはclassmethod(mgilsonの回答を参照)を介してアクセスすることも、ミックスインクラスの作成を容易にします。

于 2012-11-19T13:52:07.053 に答える
0

値の乱用などを気にしない場合は、で問題ありませんself.z。そうでなければ、A.z間違いなくクラス変数に評価されます。Bただし、サブクラスが再定義さzれた場合に何が起こるかについては注意してください Func2

class B(A):
    z = 7

b = B()
b.Func2()  # Returns 0, not 7

結局のところ、これは非常に論理的です。したがって、何らかの形で多態的な方法でクラス変数にアクセスしたい場合は、次のいずれかを実行できます。

self.__class__.z
type(self).z

ドキュメントによると、2番目の形式は古いスタイルのクラスでは機能しないため、最初の形式は通常、Python2.xバージョン間でより互換性があります。ただし、2番目の形式は、新しいスタイルのクラス、つまりPython 3.xの場合、クラスが__class__属性を再定義する可能性があるため、最も安全な形式です。

于 2013-02-04T00:17:55.533 に答える