我有一个关于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]?
谢谢大家!
答案 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
...总是引用同一个类,无论它从何处被调用。