gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:16 25 4
gpt4 key购买 nike

我已经定义了这个类:

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?

关于python - 这是面向对象语言的正常行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4962397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com