Python类中的__new__和__init__的区别

析构星云
• 阅读 1575

在写Python类时,或者看某些项目源码时,总是见到__init____new__方法,一直没有深入研究两者的区别,今天聊聊这个。

__new__

__new__是类(class)方法。

class新创建实例时,会调用__new__,它主要控制一个新实例的创建。

需要知道的是,__new__是实例创建的第一步。首先调用它,再由它负责返回类的新实例。

通常,__new__除非您要继承不可变类型(如str,int,unicode或tuple),否则不必重写。

针对__new__的用法,举个栗子:

依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。

首先我们来看一下第一个功能,具体我们可以用int来作为一个例子:假如我们需要一个永远都是正数的整数类型,通过集成 int,我们可能会写出这样的代码。

Python类中的__new__和__init__的区别

但运行后会发现,结果根本不是我们想的那样,我们任然得到了-3。
这是因为对于int这种 不可变的对象,我们只有重载它的__new__方法才能起到自定义的作用。这是修改后的代码:
Python类中的__new__和__init__的区别
通过重载__new__方法,我们实现了需要的功能。

__init__

__init__是实例方法。

class调用__init__时,是对这个class生成的新实例初始化,初始化的内容,就是__init__内定义的内容。

每新创建一个实例,实例都会初始化这些内容,这些内容都是初始化给新创建的实例,跟class无关。

__init__不返回任何东西。创建实例后,它仅负责初始化实例,且仅在需要初始化某些内容时,才会进行调用。

参考文档:
https://stackoverflow.com/que...
https://www.cnblogs.com/shenx...
本文首发于BigYoung小站
点赞
收藏
评论区
推荐文章
Bill78 Bill78
4年前
Python的新式类和旧式类
概述:Python中支持多继承,也就是一个子类可以继承多个父类/基类。当一个调用一个自身没有定义的属性时,它是按照何种顺序去父类中寻找的呢?尤其是当众多父类中都包含有同名的属性,这就涉及到新式类和经典类的区别。多继承:classFood(object):23def__init__(self,name,col
虾米大王 虾米大王
2年前
java代码092
code092.jsp通过FindServlet类查询分页数据所有图书信息ID图书名称价格数量作者<%Listlist1(List)request.getAttribute("list");for(code089book:list1)%
Bill78 Bill78
4年前
Python新式类与经典类(旧式类)的区别
Python新式类与经典类(旧式类)的区别Python中类分两种:旧式类和新式类:➤新式类都从object继承,经典类不需要。➤新式类的MRO(methodresolutionorder基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用
Stella981 Stella981
3年前
Python中的@函数装饰器到底是什么?
在解释@函数装饰器之前,先说一下,类中的类方法和静态方法。在Python中完全支持定义类方法、静态方法。这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以)。区别在于:Python会自动绑定类方法的第一个参数,类方法的第一个参数会自动绑定到类本身;但对于静态方法则不会自动绑定。类方法用@classmethod
Stella981 Stella981
3年前
Python中的__new__及其用法
\_\_new\_\_和\_\_init\_\_的区别\_\_new\_\_是Python面向对象语言中一个很少用的函数,更多使用的是\_\_init\_\_这个函数。例如:class Book(object):    def __init__(self, title):
Stella981 Stella981
3年前
Python3中的super()函数详解
关于Python3中的super()函数我们都知道,在Python3中子类在继承父类的时候,当子类中的方法与父类中的方法重名时,子类中的方法会覆盖父类中的方法,那么,如果我们想实现同时调用父类和子类中的同名方法,就需要使用到super()这个函数,用法为super().函数名()下面是一个例子:
Stella981 Stella981
3年前
JSONArray数据转换成java List
<divid"cnblogs\_post\_body"class"blogpostbody"<p<spanstyle"fontsize:18pt"1.后台接收json数组转成封装实体类的List:</span</p<divclass"cnblogs\_code"<divclass"cnblogs\_code\_tool
Stella981 Stella981
3年前
Python类中的__new__和__init__的区别
在写Python类时,或者看某些项目源码时,总是见到__init__和__new__方法,一直没有深入研究两者的区别,今天聊聊这个。__new____new__是类(class)方法。class新创建实例时,会调用__new__,它主要控制一个新实例的创建。需要知道的是,__new__是实例创建的第
Wesley13 Wesley13
3年前
Java 日期与时间
Java的日期Java没有内置的日期类,但可以导入java.time包,这个包中包含了许多类,可用于处理日期和时间。例如:<table<tbody<tr<thstyle"width:25%"Java类</th<thstyle"width:75%"描述</th</tr<tr<td<code
Stella981 Stella981
3年前
Python code question 1
Question1Level1Question:Writeaprogramwhichwillfindallsuchnumberswhicharedivisibleby7butarenotamultipleof5,between2000and3200(bothincluded).The
Stella981 Stella981
3年前
PowerDesigner列名、注释内容互换
在用PowerDesigner时,常常在NAME或Comment中写中文在Code中写英文,Name只会显示给我们看,Code会使用在代码中,但Comment中的文字会保存到数据库TABLE的Description中,有时候我们写好了Name再写一次Comment很麻烦,以下两段代码就可以解决这个问题。在PowerDesigner中PowerDesig