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

时间:2013-02-20 16:50:57

标签: 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()

打印:

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表示法来访问这个属性,或者你也许根本无法访问它。

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

3 个答案:

答案 0 :(得分:6)

oB的实例,而不是A。初始化时,会将其test属性的值设置为“b”。在任何时候你甚至都不会调用超类__init__,因此它永远不会被设置为“a” - 但即使你这样做,它也只能有一个值“a”或“b”,这取决于是否你先拨打super或第二。

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

答案 1 :(得分:0)

你说

  

如果该类具有在某些派生中也使用的属性   类

在A

的定义中
class A:
    def __init__ (self):
        self.test = "a"

并不意味着名称test的对象测试被创建为A类的属性 这意味着每次实例化一个对象时,都会在THE INSTANCE中创建一个 test 属性

因此,您无法访问不存在的A属性。

def A:
    attA = 13

会创建对象 13 作为A的属性:print(A.attA)将打印 13 的值

答案 2 :(得分: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进行了一些奇特的名称修改。