作者:在这里啊 | 来源:互联网 | 2024-12-18 15:12
本文探讨了Python中类继承时的方法调用机制,特别是当父类中定义了一个未实现的方法(如使用NotImplementedError抛出异常)时,子类如何覆盖并正确调用这些方法。
考虑以下Python代码示例:
首先定义一个基类 A
,其中包含一个构造函数 __init__
和一个抽象方法 fun
,该方法抛出 NotImplementedError
异常,表明任何直接或间接继承自 A
的类都需要提供该方法的具体实现。
1 2 3 4 5 6 | class A: def __init__(self): self.fun()
def fun(self): raise NotImplementedError |
接着,定义一个从 A
继承的子类 B
,它实现了 fun
方法,并在自己的构造函数中调用了父类的构造函数以确保所有必要的初始化步骤被执行。
1 2 3 4 5 6 | class B(A): def __init__(self): super().__init__()
def fun(self): print("fun in B") |
最后,再定义一个从 B
继承的子类 C
,同样地,它也重写了 fun
方法。
1 2 3 4 5 6 | class C(B): def __init__(self): super().__init__()
def fun(self): print("fun in C") |
当我们创建 C
类的一个实例时,会发生什么?
1. 创建 C
实例时,会调用 C
的构造函数 __init__
。
2. 在 C
的构造函数中,通过 super().__init__()
调用 B
的构造函数。
3. 同样,在 B
的构造函数中,再次通过 super().__init__()
调用 A
的构造函数。
4. 在 A
的构造函数中,尝试调用 fun
方法。由于 C
是最终的实例类型,因此实际调用的是 C
中定义的 fun
方法。
在这个过程中,虽然 A
的 fun
方法声明为未实现,但因为 C
已经提供了具体实现,所以不会触发 NotImplementedError
。实际上,fun in C
将被打印出来,显示了多态性的作用,即根据对象的实际类型动态选择方法实现。