python超级执行父方法

时间:2014-01-08 08:39:29

标签: python class super

我有一个关于python super()的问题。

这是我的代码

class A(object):
    def test(self):
        t = [self.__class__.__name__]
        return t

class B(A):
    def test(self):
        t = super(B, self).test()
        t.append(self.__class__.__name__)
        return t

B().test()

结果是[B,B]

但我想得到[A,B]

可以得到[A,B]?

谢谢大家!

3 个答案:

答案 0 :(得分:3)

您可以使用该类的__mro__属性。

>>> class A(object):
...     def test(self):
...         return [c.__name__ for c in type(self).__mro__[-2::-1]]
...
>>> class B(A):
...     pass
...
>>> B().test()
['A', 'B']
>>> A().test()
['A']

>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
>>> B.__mro__[::-1]
(<type 'object'>, <class '__main__.A'>, <class '__main__.B'>)
>>> B.__mro__[-2::-1]
(<class '__main__.A'>, <class '__main__.B'>)

答案 1 :(得分:0)

这会对你有所帮助:

class A(object):
    def test(self):
        t = [A.__name__]
        return t

class B(A):
    def test(self):
        t = super(B, self).test()
        t.append(B.__name__)
        return t

B().test()

我认为你想要类的名称,而不是实例类。

答案 2 :(得分:0)

以为我会加上与明显的期望相反的做法,

 super(B, self).func()

其中A是超类不创建A类,然后调用该函数。它只是在命名空间A中找到该函数,并在当前类中调用它。由于对象未更改,因此引用self.__class__仍然指向类B,而self.__class__.__name__仍然是名称B

事实上,如果你有像

这样的东西
class A(object):
    def func(self, somearg):
        pass

class B(A):
    def anotherfunc(self, someotherarg):
        super(B, self).func(someotherarg)
        self.func(someotherarg)

最后两个语句实际上是相同的......当你调用一个函数时,python会通过MRO查看匹配中最接近的函数。由于B实际上没有一个名为func的函数,因此它将逐渐选择A中的一个函数。

另外,作为第二个答案,您可以通过类方法(通过类__name__A直接)而不是通过实例显式调用B ...总是引用同一个类,无论它从何处被调用。