首页 > 编程语言 >Python语言中__init__与__new__的区别是什么?

Python语言中__init__与__new__的区别是什么?

时间:2023-04-25 12:00:43浏览次数:39  
标签:__ name Python self init new id

  __new__和__init__二者都是Python面向对象语言中的函数,其中__new__比较少用,__init__相对常用,那么两者有什么区别呢?以下是详细的内容:

  __new__作用:创建对象,并分配内存

  __init__作用:初始化对象的值

  注意:

  1、与java相比,java只有一个构造器。而python__new__方法与__init__方法组合,才能称为一个对应类似于java中的构造器

  2、先执行__new__ ,创建对象,并分配内存.

  再执行__init__,初始化对象的值。

  3、任何类都继承于object类。

  我们一般不重写__new__方法。 我们不重写,就默认调用父类的__new__方法。

  4、__new__方法 ,一定要return一个对象。 如果自己重写__new__方法,但是没有return出一个对象。连对象都没创建成功,后面是不会进行初始化对象的。

  例子1:

  class Person(object):

  def __init__(self,name,id,sex):

  self.name = name

  self.id = id

  self.sex = sex

  print("初始化对象的值")

  def __new__(cls, *args, **kwargs):

  print("开始创建对象,并分配内存")

  if __name__== '__main__':

  p = Person("张三",12."男")

  运行结果,只执行了__new__方法,并没有执行__init__方法。

  为啥呢? 因为new函数,没有返回一个对象。

  正确的用法

  class Person(object):

  def __init__(self,name,id,sex):

  self.name = name

  self.id = id

  self.sex = sex

  print("初始化对象的值")

  def __new__(cls, *args, **kwargs):

  print("开始创建对象,并分配内存")

  self = super().__new__(cls)

  return self

  if __name__ == '__main__':

  p = Person("张三",12."男")

  打印结果:

  开始创建对象,并分配内存

  初始化对象的值

标签:__,name,Python,self,init,new,id
From: https://blog.51cto.com/u_14661964/6223732

相关文章

  • 实验3 控制语句与组合数据类型应用编程
    实验任务1#task1实验内容importrandomprint('用列表存取随机整数:')lst=[random.randint(0,100)foriinrange(5)]print(lst)print('\n用集合存储随机整数:')s1={random.randint(0,100)foriinrange(5)}print(s1)......
  • C# 序列化与反序列化XML文件
    1//整理输出数据2List<RowData>lisOutputData=newList<RowData>();3foreach(varitemindicAssist.Keys)4{5stringkey=item+dicAssist[item];6foreach(varitmindicRowNumber[key])7{8lisOutputData.Add(dicR......
  • 混合云网络打通
    概述多云管理集群分为两类,主集群和子集群。各个集群需要打通实现一个集群的pod能够访问到另一个集群的pod。这样才能实现应用的跨云部署。主机群一般会提供一些公共服务,子集群的pod一般会去使用,这样就需要实现主子集群的网络互通。实现方式就是端口固定,通过LB暴露,然后绑定域名,通......
  • 处理Linux 终端中文显示乱码问题
    问题详情:中文命名的文件或者文件夹显示?号或者□,无法正常显示文件名1、查看是否已安装中文字体#查看已安装的中文字体fc-list:lang=zh#查看已安装的中文字体并排序fc-list:lang=zh-cn|sort2、安装字体库yum-yinstallfontconfig3、添加中文字体,建立存储中文......
  • worker-rust
    添加target:wasm32-unknown-unknownrustuptargetaddwasm32-unknown-unknowninfo:downloadingcomponent'rust-std'for'wasm32-unknown-unknown'info:installingcomponent'rust-std'for'wasm32-unknown-unknown'19.0M......
  • HTML+CSS学习--HTML表单标签
     关注我了解更多web技术知识,带你一路“狂飙”到底!上岸大厂不是梦!表单1:表单标签<form></form>属性:action='接口地址'method='get/post'name='表单名称'2:表单控件<input>属性:type='控件类型'name:属性标识表单域的名称;Value:属性定义表单域的默认值,其他属......
  • Cesium加载ArcGIS Server4490且orgin -400 400的切片服务
    Cesium在使用加载Cesium.ArcGisMapServerImageryProvider加载切片服务时,默认只支持wgs84的4326坐标系,不支持CGCS2000的4490坐标系。如果是ArcGIS发布的4490坐标系的切片服务,如果原点在orginX:-180.0Y:90.0的情况下,我们可以通过WebMapTileServiceImageryProvider按照WMTS的方式......
  • 冒泡排序详解
    引入:::tips冒泡排序顾名思义,就是像冒泡一样,泡泡在水里慢慢升上来,由小变大。虽然冒泡排序和冒泡并不完全一样,但却可以帮助我们理解冒泡排序。:::思路:::tips一组无序的数组,要求我们从小到大排列我们可以先将最大的元素放在数组末尾再将第二大的数放在数组的倒数第二......
  • python画甘特图
    #-*-coding:utf-8-*-#pipinstallplotly-ihttps://pypi.tuna.tsinghua.edu.cn/simpleimportplotlyaspyimportplotly.figure_factoryasffpyplt=py.offline.plot###test1df=[dict(Task="项目1",Start='2015-02-05',Finish......
  • rust交叉编译配置:windows上编译linux可执行程序
    rust交叉编译配置:windows上编译linux可执行程序简述交叉编译大概指在在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码.本次,我们配置的是在windows上编译出在linux上运行的rust可执行程序.我们在安装rust之后,默认会安装跟机器环境搭配的编译相关工具.......