为啥允许在 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.8.0 允许在不使用“非本地”变量的情况下从封闭函数范围更改可变类型?
请解释为啥在 Cpp、Java 和 C# 中允许或不允许 List<A> 强制转换为 List<A.super> [关闭]