Python学习笔记--构造(`__new__`)和初始化(`__init__`)

二、构造(__new__)和初始化(__init__)

通过之前的学习,我们已经知道定义一个类时,我们经常会通过 __init__(self) 的方法在实例化对象的时候,对属性进行设置。

比如下面的例子:

python 复制代码
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    def __init__(self, name, age):
        self.name = name;
        self.age = age;

user=User('两点水',23)

实际上,创建一个类的过程是分为两步的,一步是创建类的对象,还有一步就是对类进行初始化。

__new__ 是用来创建类并返回这个类的实例, 而__init__ 只是将传入的参数来初始化该实例.__new__ 在创建一个实例的过程中必定会被调用,但 __init__ 就不一定,比如通过 pickle.load 的方式反序列化一个实例时就不会调用 __init__ 方法。

def __new__(cls) 是在 def __init__(self) 方法之前调用的,作用是返回一个实例对象。还有一点需要注意的是:__new__ 方法总是需要返回该类的一个实例,而 __init__ 不能返回除了 None 的任何值

具体的示例:

python 复制代码
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    def __new__(cls, *args, **kwargs):
        # 打印 __new__方法中的相关信息
        print('调用了 def __new__ 方法')
        print(args)
        # 最后返回父类的方法
        return super(User, cls).__new__(cls)

    def __init__(self, name, age):
        print('调用了 def __init__ 方法')
        self.name = name
        self.age = age


if __name__ == '__main__':
    usr = User('两点水', 23)

看看输出的结果:

txt 复制代码
调用了 def __new__ 方法
('两点水', 23)
调用了 def __init__ 方法

通过打印的结果来看,我们就可以知道一个类创建的过程是怎样的了,先是调用了 __new__ 方法来创建一个对象,把参数传给 __init__ 方法进行实例化。

其实在实际开发中,很少会用到 __new__ 方法,除非你希望能够控制类的创建。通常讲到 __new__ ,都是牵扯到 metaclass(元类)的。

当然当一个对象的生命周期结束的时候,析构函数 __del__ 方法会被调用。但是这个方法是 Python 自己对对象进行垃圾回收的。

相关推荐
cdut_suye12 分钟前
踏浪而行,2024年技术创作的星光轨迹
经验分享·笔记·学习方法·热榜·博客之星·学习历程·回顾2024
深蓝海拓15 分钟前
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
数据库·python·qt·pyqt
无须logic ᭄22 分钟前
CrypTen项目实践
python·机器学习·密码学·同态加密
百流35 分钟前
scala文件编译相关理解
开发语言·学习·scala
Channing Lewis35 分钟前
flask常见问答题
后端·python·flask
Channing Lewis37 分钟前
如何保护 Flask API 的安全性?
后端·python·flask
水兵没月2 小时前
钉钉群机器人设置——python版本
python·机器人·钉钉
我想学LINUX3 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
雁于飞3 小时前
c语言贪吃蛇(极简版,基本能玩)
c语言·开发语言·笔记·学习·其他·课程设计·大作业