2

以下のコード サンプルでは、​​派生クラス b で self.number を使用しており、number は a (基本クラス) で定義されています。データ メンバーが基本クラスでこのように定義されている場合、派生クラスから常にアクセスできますか?

Python 2.7 を使用しています。これは基本オブジェクトのメンバー変数を参照する正しい方法ですか?

class a(object):
    def __init__(self, number):
        self.number = number
        print "a __init__ called with number=", number

    def printme(self):
        print self.number



class b(a):
    def __init__(self, fruit):
        super(b, self).__init__(1)
        self.fruit = fruit
        print "b __init__ called with fruit=", fruit

    def printme(self):
        print self.number


cl1 = a(1)
cl1.printme()

cl2 = b("apple")
cl2.printme()
4

1 に答える 1

4

サブクラスでそれを排除するようなことをしない限り、そうです。Python オブジェクトに割り当てられた属性は、オブジェクトに追加されるだけ__dict__で (スロットが使用されたり、非標準的なことを行うためにオーバーライドされたりする比較的まれなケースを除いて__setattr__)、バインドされたメンバー メソッドへの暗黙の最初の引数は、子クラスまたは親クラスに由来するメソッド。通常のインスタンス属性 (ただし、メソッドやクラス属性ではない) は、特定のクラス定義にバインドされることはなく、それらが属するオブジェクト インスタンスにのみバインドされます。

このステートメントの 1 つの注意点は、名前が 2 つのアンダースコアで始まる属性です。これらは引き続き に追加され、__dict__アクセス可能になりますが、名前がマングルされているため、属性名のマングル変換を使用して取得した場合にのみ、定義クラスの外部からアクセスできます。

于 2013-07-17T13:51:01.407 に答える