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 表示法访问此属性,或者您可能不能完全访问它。

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

4

3 回答 3

6

o是 的一个实例B,不是A。初始化时,它将其test属性的值设置为“b”。您甚至都不会调用超类__init__,因此它永远不会设置为“a” - 但即使您这样做了,它也只能具有值“a”或“b”中的一个,具体取决于您调用的是superfirst 还是 second .

不知道为什么您认为这会破坏 Python 对象模型。

于 2013-02-20T16:59:42.520 回答
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 的属性:print(A.attA)将打印13的值

于 2013-02-20T17:40:13.540 回答