Skip to main content
 首页 » 编程设计

python之这是面向对象语言的正常行为吗

2025年05月04日11pengyingh

我已经定义了这个类:

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?