加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

详解python中的__init__与__new__方法

发布时间:2020-12-16 23:55:54 所属栏目:Python 来源:网络整理
导读:一、__init__和__new__方法执行的顺序? 在中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行。 二、__new__方法是什么? 首先,我们先来看下下面的代码 = = ( (cls,*args,** ( super(person,cls). obj1 =person(span style="color: #80

一、__init__和__new__方法执行的顺序?

在中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行。

二、__new__方法是什么?

首先,我们先来看下下面的代码

==( (cls,*args,**( super(person,cls).obj1=person(<span style="color: #800000;">'<span style="color: #800000;">wd<span style="color: #800000;">',22<span style="color: #000000;">)
执行结果:
<span style="color: #0000ff;">exec
<span style="color: #000000;"> new....
<span style="color: #0000ff;">exec
init....

上面代码告诉了我们,执行init之前new方法执行了,并且代码中重构了父类的new方法,在上一篇面向对象过程中解释了类创建过程,执行new的过程就是person类创建的过程,所以__new__方法实际上就是。(这里指的是person类)

?说明下上述代码的执行过程:

1.当解释器解释到obj1=person('wd',22)时候,先执行__new__(cls,**kwargs),并执行父类的__new__方法,将name,age参数传入父类__new__方法,创建person。

2.类创建完成以后,在调用__init__方法,将wd和22参数传入创建对象。

三、__init__与__new__的区别

从上述过程中我们可以发现,这两个方法区别在于:

1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。2.__new__ 通常用于控制生成一个类实例的过程。它是类级别的方法。

四、__new__的作用

依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int,str,tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。首先我们来看一下一个功能,自定义类似int类功能,使用int类整数化以后将数变为非负数(大于0)。

(cls,**( super(myint,cls).(cls,abs(*<span style="color: #0000ff;">print(myint(-1))<span style="color: #008000;">#<span style="color: #008000;">自定义int类
<span style="color: #0000ff;">print
(int(-1))<span style="color: #008000;">#
<span style="color: #008000;">自带的int类

<span style="color: #000000;">结果:
<span style="color: #0000ff;">exec
<span style="color: #000000;"> new....
1
-1

五、通过__new__方法实现单实例

?单例模式,可以简单理解为实例化后生成的每个实例都是完全一样的。

hasattr(cls,= super(Single,cls). cls.myinstance obj1 =<span style="color: #000000;"> Single()
obj2
=<span style="color: #000000;"> Single()

obj1.attr1 = <span style="color: #800000;">'<span style="color: #800000;">wd<span style="color: #800000;">'
<span style="color: #0000ff;">print<span style="color: #000000;">(obj1.attr1,obj2.attr1)
<span style="color: #0000ff;">print(obj1 <span style="color: #0000ff;">is obj2)<span style="color: #008000;">#<span style="color: #008000;">返回True表明是同一个实例
<span style="color: #000000;">结果:
wd wd
True

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读