Python 面试高频问题:__Init__ 和__New__的区别

Python 面试高频问题:__Init__ 和__New__的区别

Python类内部定义,以_ _ xx _ _ 结尾的方法,都是类的内置方法,也称之为魔法方法。

类的内置方法,会在某种条件满足下自动触发,这里我们重点讲解一下__init__和__new__,他们与实例创建有关。

简述__init__

__init__(self): 这个方法我们相对较熟悉,他是python 类中默认的初始化方法,即一个类实例化时,就会执行的方法。

详解__new__

__new__ 方法重写非常固定,通常如下:

def __new__(cls):return super().__new__(cls)

登录后复制

其中cls 代表类本身。

重写__new__方法的代码非常固定:重写__new__方法一定要return super().__new__(cls),或者return object.__new__(cls)否则python解释器会得不到分配了空间的对象引用,就不会调用对象的初始化方法。例如:

class Mycls:def __new__(cls): print('new') return super().__new__(cls)def __init__(self):print('init')my=Mycls()

登录后复制

输出:

newinit

我们可以看到new 在init之前输出,证明__new__(cls)在__init__(self)之前执行。

我们重写代码:

def __new__(cls): print('new')my=Mycls()print(my)

登录后复制

输出:

newNone

可以看到如果__new__(cls):中没有返回值,不会返回实例,__init__(self)将不会执行。

__new__和__init__总结

1.__new__()方法用于创建实例,类实例化之前会首先调用,它是class的方法,是个静态方法。而__init__()方法用户初始化实例,该方法用在实例对象创建后被调用,它是实例对象的方法,用于设置类实例对象的一些初始值。

2.如果类中同时出现了__init__()方法和__new__()方法,则先调用__new__()方法后调用__init__()方法。__new__()方法是创建实例的第一步,执行完了需要返回创建的类的实例,否则则报错,无法执行__init__()方法。其中,__init__()方法将不返回任何信息。

__new__的应用

有的同学会问 用__new__来实现什么东东呢?

个人觉得,单例就是一个最经典的应用。单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当我们希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。

具体实现代码如下:

class Mycls:_instance = None def __new__(cls): # 判断该类的属性是否为空;对第一个对象没有被创建,我们应该调用父类的方法,为第一个对象分配空间 if cls._instance == None: # 把类属性中保存的对象引用返回给python的解释器cls._instance = object.__new__(cls)return cls._instance# 如果cls._instance不为None,直接返回已经实例化了的实例对象else:return cls._instancedef __init__(self):print('init')my1=Mycls()print(my1)my2=Mycls()print(my2)

登录后复制

输出:

initInit

登录后复制

可以看到虽然叫my1 和my2,但是他们都是对象0x000000406E471148,这就是单例模式的应用。

以上就是Python 面试高频问题:__Init__ 和__New__的区别的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2242078.html

(0)
上一篇 2025年2月26日 20:49:20
下一篇 2025年2月23日 22:47:51

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 不会做图表?十个Python数据可视化库来帮你!

    1、matplotlib 两个直方图 matplotlib 是Python可视化程序库的泰斗。经过十几年它任然是Python使用者最常用的画图库。它的设计和在1980年代被设计的商业化程序语言MATLAB非常接近。 由于 matplotli…

    2025年2月26日 编程技术
    200
  • Python函数式编程:返回函数与匿名函数

    返回函数 所谓返回函数,顾名思义,就是把函数作为返回值。高阶函数除了可以将函数作为参数之外,还可以将函数作为结果进行返回。下面来实现一个可变参数的连乘,求积函数可定义为: def calc_fac(*args):fx = 0for n in…

    2025年2月26日
    200
  • 五个让日常编码更简单的 Python 库

    今天我们一起来研究一些非常有用的第三方模块,可以使得我们的日常编码变得更加简单方便。 ​sh https://github.com/amoffat/sh 如果曾经在 Python 中使用过 subprocess 库,那么我们很有可能对它感到…

    2025年2月26日 编程技术
    200
  • 十行 Python 代码实现酷炫功能

    一、生成二维码 二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,而生成一个二维码也非常简单,在Python中我们可以通过MyQR模块了生成二维码,而生成一…

    2025年2月26日
    200
  • 31个必备的Python字符串方法,建议收藏!

    字符串是Python中基本的数据类型,几乎在每个Python程序中都会使用到它。 1、Slicing slicing切片,按照一定条件从列表或者元组中取出部分元素(比如特定范围、索引、分割值) s = ‘ hello ‘s = s[:]pr…

    2025年2月26日
    200
  • iPad适合用来写Python吗?

    B站上有很多博主拍过iPad作为生产力的视频,比如用iPad画漫画、记笔记、剪视频、轻办公等等,那么iPad可以用来写代码、跑Python吗? 这也是一些初学Python的小伙伴关心的问题,他们经常下载一些编辑Python的APP,试图在上…

    2025年2月26日 编程技术
    200
  • Python神操作!乱序文件重新命名编号!

    如下图所示,在本地文件夹中有这样一堆视频文件,在这种情况下并不是乱序的。 但是将其上传到网盘中后,就会经常变成乱序。即它们会按照1、10、11、2、20这样排序,并不方便我们按顺序去依次观看。 所以我们希望能够给它们在本地重新命名编号,比如…

    2025年2月26日 编程技术
    200
  • Python 内存管理的工作原理,你了解吗?

    Python 为开发者提供了许多便利,其中最大的便利之一是其几乎无忧的内存管理。开发者无需手动为 Python 中的对象和数据结构分配、跟踪和释放内存。运行时会为你完成所有这些工作,因此你可以专注于解决实际问题,而不是争论机器级细节。 尽管…

    2025年2月26日
    200
  • Python 中的输入函数:概念和示例

    Python 是世界上最流行的编程语言之一,广泛应用于各种应用程序中。Python 中的一个基本概念是 ​​input()​​ 函数,它允许用户通过提供输入值与程序进行交互。 让我们看看 ​​input()​​ 函数是如何工作的,以及如何在…

    2025年2月26日
    200
  • 分享十个超级实用事半功倍的Python自动化脚本

    在日常的工作学习当中,我们总会遇到各式各样的问题,其中不少的问题都是一遍又一遍简单重复的操作,不妨直接用Python脚本来自动化处理,今天小编就给大家分享十个Python高级脚本,帮助我们减少无谓的时间浪费,提高工作学习中的效率。 给照片添…

    2025年2月26日
    200

发表回复

登录后才能评论