为啥允许在 Python 中使用 super 从 __init__ 返回一个值?

Posted

技术标签:

【中文标题】为啥允许在 Python 中使用 super 从 __init__ 返回一个值?【英文标题】:Why allow to return a value from __init__ with super in Python?为什么允许在 Python 中使用 super 从 __init__ 返回一个值? 【发布时间】:2022-01-06 11:55:16 【问题描述】:

来自the documentation of __init__

__init__() 不能返回非 None 值;这样做会导致在运行时引发 TypeError。

我从框架的可扩展基类中找到了这段代码。

它运行时没有运行时错误。

class Parent():
    def __init__(self, x):
        self.x = x
        return self.x + 10

class Child(Parent):
    def __init__(self, x):
        y = super(Child, self).__init__(x)
        print(y)

c = Child(5)

我对其进行了搜索,并同意将数据从 super().__init__ 传递到派生类,而不必通过实例中继它。

但是,为什么 python 允许 __init__ 返回值?

这是一种广为人知的模式吗?

【问题讨论】:

请链接您在其中找到您引用的信息的文档。 我认为是type.__call__ 检测__init__ 何时返回值。在Child 中,您自己调用__init__,而不关心它返回int @khelwood:我也这么认为,但至少it's written 的方式类似 docs.python.org/3/reference/datamodel.html#object.__init__ 有不同的措辞:“因为 __new__() 和 __init__() 在构造对象时一起工作(__new__() 来创建它,而 __init__() 来定制它),没有非__init__() 可能不会返回任何值;这样做会导致在运行时引发 TypeError。" 如果您尝试直接实例化Parent,我认为您找到的代码会出错。 【参考方案1】:

当一个类被实例化时,python 会寻找一个名为__init__ 的方法并使用它来设置新类。如果此方法在此处返回 None 以外的任何内容,则会引发错误:

class Parent():
    def __init__(self, x):
        self.x = x
        return self.x + 10

Parent(5)
# TypeError: __init__() should return None, not 'int'

但是,在您的子类中,您不能让 Python 使用 Parent 中的 __init__ 方法 - 而是通过创建自己的 __init__ 来覆盖它,它不会返回任何内容。

然后您调用Parent __init__ 方法(通过super)但在这里您只是将其称为“普通”方法,而不是将其用作类设置的一部分,因此它不会引发错误。

【讨论】:

以上是关于为啥允许在 Python 中使用 super 从 __init__ 返回一个值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥是 super.super.method();在 Java 中不允许?

在 Python 中,为啥为没有定义超类的类调用 super() 函数不是错误? [复制]

为啥 Python 3.x 的 super() 有魔力?

为啥 Python 3.8.0 允许在不使用“非本地”变量的情况下从封闭函数范围更改可变类型?

请解释为啥在 Cpp、Java 和 C# 中允许或不允许 List<A> 强制转换为 List<A.super> [关闭]

Python:为啥模块中不允许“return”