zoukankan      html  css  js  c++  java
  • python学习笔记之--__new__方法和__init__方法

    __new__和__init__的主要区别在于

    __new__是用来创造一个类的实例的(constructor),而__init__是用来初始化一个实例的(initializer)

     构造方法包括创建对象和初始化对象,在python当中,分为两步执行:先执行__new__方法,然后执行__init__方法;

    • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。是一个实例方法
    • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法

    也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。

    在研究具体的实现之前,我们应该知道 __new__ 方法只接受 cls 作为它的第一个参数,而 __init__ 一个参数是 self (__new__ 是一个类方法,而__init__ 是一个对象方法)。

    因为我们调用 __new__ 之前连实例都还没有,因此那时根本没有 self 的存在。__init__ 在 使用 __new__ 创建并返回一个实例之后调用,因此可将返回的实例通过self传递给它。

    class newStyleClass(object):
    
        def __init__(self):
            print("__init__ is called")
            print("self is:",self)
        
        def __new__(cls):
            print("__new__ is called")
            return super(newStyleClass, cls).__new__(cls)
    
    
    
    newStyleClass()

    F:PyCharmpypojectlearnvenvScriptspython.exe E:/pytest/202001/a0121.py
    __new__ is called
    __init__ is called
    self is: <__main__.newStyleClass object at 0x000002120D56FCC0>

    创建类实例并初始化的过程中__new__和__init__被调用的顺序也能从上面代码的输出结果中看出:__new__函数首先被调用,构造了一个newStyleClass的实例,接着__init__函数在__new__函数返回一个实例的时候被调用,并且这个实例作为self参数被传入了__init__函数。

  • 相关阅读:
    河南省第十届ACM省赛G:Plumbing the depth of lake
    南洋理工oj 题目92 图像有用区域
    初学欧拉图,知识总结,后续增加
    初学并查集知识总结后续增加
    南阳oj 题目42 一笔画问题
    南阳oj 题目 90 整数划分
    南阳oj题目20吝啬的国度 菜鸟的进阶之路
    南阳oj 题目21 三个水杯
    UVA-540 Team Queue
    HDU-1596 find the safest road
  • 原文地址:https://www.cnblogs.com/wenm1128/p/12222287.html
Copyright © 2011-2022 走看看