0

私はそれに入るほどpythonに戸惑います。

たとえば、次のコード:

class A:
    def __init__ (self):
        self.test = "a"

    def dump(self):
        print("A.test: %s" % (self.test,))
        print("A.test: %s" % (self.__dict__["test"],))
        print("A.test: %s" % (getattr(self, "test"),))
        print()

class B (A):
    def __init__ (self):
        self.test = "b"

    def dump(self):
        print("B.test: %s" % (self.test,))
        print("B.test: %s" % (self.__dict__["test"],))
        print("B.test: %s" % (getattr(self, "test"),))
        print()


o = B ()
o.dump()
A.dump(o)
super(B, o).dump()

プリント:

B.test: b
B.test: b
B.test: b

A.test: b
A.test: b
A.test: b

A.test: b
A.test: b
A.test: b

これは、基本クラスの関数を呼び出すことができることを示しているようですが、そのクラスに派生クラスでも使用された属性がある場合、通常の object.attribute 表記を使用してこの属性にアクセスすることはできません。絶対にアクセスしてください。

それは本当に本当ですか?もしそうなら、それは殺すでしょう-IMHO-pythonオブジェクトモデル全体。

4

3 に答える 3

0

これはあなたが探しているものですか?

class A(object):
    def __init__ (self):
        self.__test = "a"

    def dump(self):
        print "A.test:", self.__test

class B (A):
    def __init__ (self):
        super(B, self).__init__()
        self.__test = "b"

    def dump(self):
        print "B.test:", self.__test


o = B()
o.dump()
super(B, o).dump()

出力:

B.test: b
A.test: a

(Python 2を使用しますが、アイデアは得られます。)

これが機能するのは、Pythonが疑似プライベート__variablesを使用していくつかの派手な名前マングリングを行うためです。

于 2013-02-20T17:59:41.657 に答える
0

あなたは言う

そのクラスに、派生クラスでも使用された属性がある場合

Aの定義では

class A:
    def __init__ (self):
        self.test = "a"

nameのオブジェクトテストtestがクラス A の属性として作成されるという意味ではありません
オブジェクトがインスタンス化されるたびに、属性テストが THE INSTANCE で作成されることを意味します

したがって、存在しない A の属性にアクセスすることは期待できません。

def A:
    attA = 13

オブジェクト13を A の属性として作成します: 13print(A.attA)の値を出力します

于 2013-02-20T17:40:13.540 に答える