Python:子 class 中的重写方法跳过了一个 Base Class
Python: Overriding method in child class skipping one of the Base Class
我有两个基 类 A
和 B
它们每个都有一个方法 myfunc
,打印出不同的字符。
class A:
def myfunc(self):
print('A')
class B:
def myfunc(self):
print('B')
我还有一个 class C
继承自 A
和 B
。在 class C
中,我覆盖了 myfunc
并调用了 super
。
class C(B, A):
def myfunc(self):
super().myfunc()
现在如果我执行下面的代码,它只打印一个字符
x = C()
x.myfunc()
输出:
B
我试过print(C.__mro__)
,它给了我(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
所以它应该去class A
并打印字符A
。对吧?
此外,如果我像 C(A,B)
那样切换继承顺序并使用相同的代码,它会跳过 class B
。
我的问题:
- 为什么跳过
class A
?
- 如何在类
A
和B
中执行myfunc
方法
我查了一下 但发现它很混乱。
回答问题 1:
它正在跳过 class A 上的 myFunc
因为当您调用 super.myFunc()
时 python 所做的是在中搜索名称为 myFunc
的第一个函数所有基数 classes(在本例中为 B
和 A
)并按顺序执行,因此它首先在 class B
。所以,因为在 class B
python 中有一个名为 myFunc
的函数,所以停止搜索并只执行它。
回答问题 2:
有一种简单的方法可以做到这一点:
class A:
def f(self):
print('A')
class B:
def f(self):
print('B')
class C(B, A):
def f(self):
A.f(self)
B.f(self)
c = C()
c.f()
基本上你可以调用任何 class 的任何函数,然后将实例作为第一个参数传递 (self
)。我相信你不能只用一次调用来执行这两个函数,你需要为每个函数调用一次。
我有两个基 类 A
和 B
它们每个都有一个方法 myfunc
,打印出不同的字符。
class A:
def myfunc(self):
print('A')
class B:
def myfunc(self):
print('B')
我还有一个 class C
继承自 A
和 B
。在 class C
中,我覆盖了 myfunc
并调用了 super
。
class C(B, A):
def myfunc(self):
super().myfunc()
现在如果我执行下面的代码,它只打印一个字符
x = C()
x.myfunc()
输出:
B
我试过print(C.__mro__)
,它给了我(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
所以它应该去class A
并打印字符A
。对吧?
此外,如果我像 C(A,B)
那样切换继承顺序并使用相同的代码,它会跳过 class B
。
我的问题:
- 为什么跳过
class A
? - 如何在类
A
和B
中执行
myfunc
方法
我查了一下
回答问题 1:
它正在跳过 class A 上的 myFunc
因为当您调用 super.myFunc()
时 python 所做的是在中搜索名称为 myFunc
的第一个函数所有基数 classes(在本例中为 B
和 A
)并按顺序执行,因此它首先在 class B
。所以,因为在 class B
python 中有一个名为 myFunc
的函数,所以停止搜索并只执行它。
回答问题 2:
有一种简单的方法可以做到这一点:
class A:
def f(self):
print('A')
class B:
def f(self):
print('B')
class C(B, A):
def f(self):
A.f(self)
B.f(self)
c = C()
c.f()
基本上你可以调用任何 class 的任何函数,然后将实例作为第一个参数传递 (self
)。我相信你不能只用一次调用来执行这两个函数,你需要为每个函数调用一次。