如何通过直接引用类来创建__init__对象?

时间:2018-06-15 04:30:49

标签: python python-3.x

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

我的问题是,当没有创建自我时,python如何自动将自身传递到__init__方法?是否有一些我不熟悉的幕后流程?它看起来像鸡蛋之前的鸡蛋。

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

1 个答案:

答案 0 :(得分:1)

  

我的问题是,当没有创建自我时,python如何自动将自身传递到 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__()方法。