python访问在派生类中重新定义的属性

car*_*rem 0 python python-3.x

我对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()
Run Code Online (Sandbox Code Playgroud)

打印:

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
Run Code Online (Sandbox Code Playgroud)

这似乎表明您可以调用基类的函数,但如果该类具有某个派生类中也使用的属性,则无法使用普通的object.attribute表示法访问此属性,或者您可能无法访问该属性完全访问它.

这是真的吗?如果是这样它会杀死 - 恕我直言 - 整个python对象模型.

Dan*_*man 6

o是一个实例B,而不是A.初始化时,它将其test属性的值设置为"b".在任何时候你甚至都不会调用超类__init__,所以它永远不会被设置为"a" - 但即使你这样做,它也只能有一个值"a"或"b",这取决于你是super先调用还是调用第二个.

不知道为什么你认为这打破了Python对象模型.