如何在python中访问对象的祖先

时间:2017-02-21 14:32:17

标签: python object ancestor

假设A类继承自B,B继承自C。

class C():
    def my_method(self):
        pass

class B(C):
    def my_method(self):
        pass

class A(B):
    def my_method(self):
        # Call my_method from B
        super(A, self).my_method()
        # How can I call my_method from C here ?

问题:如何从C调用my_method?

3 个答案:

答案 0 :(得分:1)

您可以直接调用“未绑定”方法调用C的{​​{1}}方法,并将my_method()作为参数传递。例如:

self

运行时,将打印以下内容(请注意,class C(object): def my_method(self): print('C.my_method') class B(C): def my_method(self): print('B.my_method') class A(B): def my_method(self): print('A.my_method') super(A, self).my_method() # calls B.my_method(self) C.my_method(self) # calls C.my_method(self) a = A() a.my_method() 需要(object)才能使用Python 2.x):

super()

然而,正如其他人所指出的,这可能不是达到你想要的最佳方式。你能举一个具体的例子说明你在上下文中想要达到的目标吗?

答案 1 :(得分:0)

您可以使用__mro__属性访问对象的完整祖先:

In [3]: KeyError.__mro__
Out[3]: (KeyError, LookupError, StandardError, Exception, BaseException, object)

答案 2 :(得分:0)

首先,如果你想使用超级函数,那么你必须使用基类作为这样的对象

class c(object):
    pass

因为超级功能仅支持python的新式编程。

现在来谈谈如何访问基类的基类功能。在你的例子中,如何从A。

调用C类的my_method函数

您可以通过静态和动态两种方式执行此操作。

<强>动态

class C(object):
    def my_method(self):
        print "in function c"

class B(C):
    def my_method(self):
        print "in function b"

class A(B):
    def my_method(self):
        # Call my_method from B
        super(A, self).my_method()
        # This is how you can call my_method from C here ?
        super((self.__class__.__bases__)[0], self).my_method()
obj_a = A()
obj_a.my_method()

这里(self.__class__.__bases__)将返回元组类型的A的基类,这就是我获取第0个索引的原因。所以它返回B类,因此在超级中将B类作为参数,它将返回b类基类的my_method函数。

<强>静

class C(object):
    def my_method(self):
        print "in function c"

class B(C):
    def my_method(self):
        print "in function b"

class A(B):
    def my_method(self):
        # Call my_method from B
        super(A, self).my_method()
        # This is how you can call my_method from C here ?
obj_a = A()
super(A,obj_a).my_method() # calls function of class B
super(B,obj_a).my_method() # calls function of class A