首页 > 解决方案 > 如何通过直接引用类来创建带有 __init__ 的对象?

问题描述

所以我知道实例对象有绑定方法,但你也可以通过访问类来调用函数,因为函数可以是所述类的属性。

__init__那么我的问题是,当没有创建 self 时,python 如何自动将 self 传递给方法?是否有一些我不熟悉的幕后流程?这似乎是先有鸡先有蛋之类的东西。

我知道其他函数调用确实需要您传递实例化对象,但 init 对我来说似乎很神秘。

标签: pythonpython-3.x

解决方案


那么我的问题是,当没有创建 self 时,python 如何自动将 self 传递给init方法?是否有一些我不熟悉的幕后流程?这似乎是先有鸡先有蛋之类的东西。

是的,你是对的。在创建类实例__init__调用。不创建类实例,它只是允许“自定义”实例。是实际用于创建新类实例的方法。它接受对类对象的引用以及传递给所述类对象的任何参数。__init____new__

这是__init____new__方法的文档:

__init__

在创建实例之后(由__new__())调用,但在它返回给调用者之前调用。参数是传递给类构造函数表达式的参数。如果基类有__init__()方法,则派生类的__init__()方法(如果有)必须显式调用它以确保正确初始化实例的基类部分;例如:super().__init__([args...])

因为__new__()__init__()一起构造对象(__new__()创建对象和自定义对象),所以;__init__()不能返回非 None 值。__init__()这样做会导致在运行时引发 TypeError。

__new__

调用以创建类cls的新实例。__new__()是一个静态方法(特殊情况,因此您不需要这样声明),它将请求实例的类作为其第一个参数。其余参数是传递给对象构造函数表达式(对类的调用)的参数。的返回值__new__()应该是新的对象实例(通常是cls的实例)。

典型的实现通过使用适当的参数调用超类的__new__()方法来创建类的新实例super().__new__(cls[, ...]),然后在返回之前根据需要修改新创建的实例。

如果__new__()返回cls的实例,则将调用新实例的__init__()方法__init__(self[, ...]),其中 self 是新实例,其余参数与传递给 的参数相同__new__()

如果__new__()不返回cls__init__()的实例,则不会调用新实例的方法。


推荐阅读