我已经定义了这个类:
class RequiredFormSet(BaseFormSet):
def __init__(self, *args, **kwargs):
super(RequiredFormSet, self).__init__(*args, **kwargs)
并覆盖此方法:
def total_form_count(self):
return self._total_form_count
碰巧 super(...).__init__ 在该函数的某处使用了 total_form_count()。它正在调用 我的 函数,而不是基类中定义的函数。
我想我认为因为我调用了 super() 它会使用它自己的东西,但显然在 Python 中这不是真的。这是它在其他语言(如 C#)中的工作方式吗?如果我调用基本构造函数,它仍会从那里调用所有派生函数?
请您参考如下方法:
是的,这是典型的 OOP 行为(多态性),通过动态调度调用子类方法。这是 C# 要求程序员将可覆盖方法标记为 virtual 的部分原因。我相信您一般都熟悉这个概念,而令人惊讶的主要是因为这是在构造函数中发生的。
正如您所观察到的,这在构造函数中可能非常危险,因为父类(super class)的构造函数可以调用子类的方法,而子类的方法可能依赖于子类构造函数中初始化的属性。 Effective Java 中明确指出了此问题,您可以在此处阅读更多相关信息:What's wrong with overridable method calls in constructors?
