详解python中的__init__与__new__方法
一、__init__和__new__方法执行的顺序?
在面向对象中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行。
二、__new__方法是什么?
首先,我们先来看下下面的代码
- class person(object):
- def __init__(self,name,age):
- self.age=age
- self.name=name
- print('exec init....')
- def __new__(cls, *args,**kwargs):
- print('exec new....')
- return super(person,cls).__new__(cls)
- obj1=person('wd',22)
- 执行结果:
- exec new....
- exec init....
上面代码告诉了我们,执行init之前new方法执行了,并且代码中重构了父类的new方法,在上一篇面向对象过程中解释了类创建过程,执行new的过程就是person类创建的过程,所以__new__方法实际上就是创建这个类实例方法。(这里指的是person类)
说明下上述代码的执行过程:
1.当解释器解释到obj1=person('wd',22)时候,先执行__new__(cls,*args,**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)。
- class myint(int):
- def __new__(cls, *args,**kwargs):
- print('exec new....')
- return super(myint,cls).__new__(cls,abs(*args))
- print(myint(-1))#自定义int类
- print(int(-1))#自带的int类
- 结果:
- exec new....
- 1
- -1
五、通过__new__方法实现单实例
单例模式,可以简单理解为实例化后生成的每个实例都是完全一样的。
- class Single(object):
- def __new__(cls):
- if not hasattr(cls, 'myinstance'):
- cls.myinstance = super(Single, cls).__new__(cls)
- return cls.myinstance#每次生成的都是同一个实例
- obj1 = Single()
- obj2 = Single()
- obj1.attr1 = 'wd'
- print(obj1.attr1, obj2.attr1)
- print(obj1 is obj2)#返回True表明是同一个实例
- 结果:
- wd wd
- True
详解python中的__init__与__new__方法的更多相关文章
- 详解Python中的__init__和__new__(静态方法)
一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: #-*- co ...
- 详解Python中的__init__和__new__
转载:https://my.oschina.net/liuyuantao/blog/747164 1.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ ...
- python中的__init__ 、__new__、__call__小结
这篇文章主要介绍了python中的__init__ .__new__.__call__小结,需要的朋友可以参考下 1.__new__(cls, *args, **kwargs) 创建对象时调用,返回 ...
- 举例详解Python中的split()函数的使用方法
这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:sp ...
- 详解Python中re.sub--转载
[背景] Python中的正则表达式方面的功能,很强大. 其中就包括re.sub,实现正则的替换. 功能很强大,所以导致用法稍微有点复杂. 所以当遇到稍微复杂的用法时候,就容易犯错. 所以此处,总结一 ...
- 详解Python中内置的NotImplemented类型的用法
它是什么? ? 1 2 >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Pyth ...
- Python中的__init__和__new__
一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- c ...
- python中的__init__和__new__的区别
一.__init__ 方法是什么?(init前后的线是双下划线) 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例 ...
- python类中的__init__和__new__方法
Python中类: Python中在创建类的过程中最先调用的不是__init__方法而是__new__方法,__new__方法是一个静态方法,在创建一个类对象时其实是通过__new__方法首先创建出一 ...
随机推荐
- Geohash-》基本使用
我把类文件放到了以上这个路径,在要使用的文件引入使用. 以下是测试代码, 1.先实例化类 2.再调用函数 3.这个函数返回GeoHash编码
- mysql一致性读
Consistent Nonlocking Reads 一致读意味着InnoDB用多版本来提供一个查询数据库某个时间点的快照.这种查询可以看到在当前世界点之前事务提交的改变,看不到此后提交的改变,更看 ...
- unity3d ipv6支持
unity游戏应用提交app stroe需要通过ipv6测试,但是unity本身我没找到可用的接口,所以使用ios插件来处理. 插件的IOSNativeNet.h和IOSNativeNet.m代码: ...
- HTML知识点总结之ul,ol,li标签
HTML列表分为有序列表,无序列表和描述列表.我们常用的是有序列表(ol)与无序列表(ul). 有序列表 <ol>标签就可以定义一个有序列表,之所以称其为有序列表,是因为可以使列表具有排序 ...
- (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...
- js实现黑客帝国文字下落效果
突然想到这个效果便想实现以下. 当然免不了要百度一下,于是查找到 http://www.cnblogs.com/myvin/p/4775152.html这篇文章, 效果可以查看博文中的给出的效果图.那 ...
- htm的常见布局
布局是CSS中一个重要部分,本文总结了CSS布局中的常用技巧,包括常用的水平居中.垂直居中方法,以及单列布局.多列布局的多种实现方式(包括传统的盒模型布局和比较新的flex布局实现),希望能给需要的小 ...
- Android权限管理知识学习记录
一.Android权限背景知识 在Android 6.0之前,所申请的权限只需要在AndroidManifest.xml列举就可以了,从而容易导致一些安全隐患,因此,在Android 6.0时,Goo ...
- 基于Grafana+SimpleJson的灵活报表解决方案
在时序分析及监控展现领域,Grafana无疑是开源解决方案中的翘楚,其灵活的插件机制,支持各种漂亮的面板.丰富的数据源以及强大的应用.典型的面板有Graph.Text.Singlestat.PieCh ...
- git遇到的问题解决方案
问题1: The requested URL returned error: 401 Unauthorized while accessing? 问题原因: 1.无法访问是因为你将项目设置为私人的,所 ...