python中 __new__和__init__
python这两个函数和类的实例化有关。
__init__是实例化完成之后调用的,会对生成的对象实例做一些修饰
__new__是python新类型才有的,它更像是c/c++里面的构造函数,因为这个函数会返回一个合法的实例。
看下面的例子
>>> class A(object):
... pass
...
>>> class B(A):
... def __init__(self):
... print '__init__ running'
... def __new__(cls,*args, **kwargs):
... print "new %s" %cls
... print '__new__ running'
... return object.__new__(A, *args, **kwargs)
我们先生成了一个类A, 然后根据类A生成了一个类B。 注意B中定义了 __init__函数,它什么也没敢,只是打印一句话证明自己在运行,当然你可以在里面加一些别的操作。 而__new__函数就需要仔细注意一下了。这个__new__函数显示打印了当前的cls。 这个cls是像self一样在调用的时候不需要显示传给的。cls是当前的类,我们在__new__中把将其打印出来,这样你就能更直观的明白cls是什么。 然后我们打印一句话证明__new__在运行,再然后我们调用 object的new来返回一个值。注意这里调用的第一个参数是A,也就是说返回的对象是类型A的。
然后我们运行一下下面的代码。
>>> b=B()
new <class '__main__.B'>
__new__ running
b=B() 会调用B中的__new__()。 两行输出我们可以看到。但是我们知道__init__函数是在实例化之后被调用的,这里似乎没有调用__init__。 这是为什么呢? 因为我们B类中的__new__返回的类型是A类型。 __new__如果返回的不是当前类 cls 的实例,那么 __init__ 是不会被调用的。 我之前想,也许因为返回的是A类型的实例,那么如果A类型有__init__ 也许就会调用A类型的__init__。 事实证明也不会。
ok.我们把B类改一下,让其__new__返回cls 也就是当前类的实例。
>>> class B(A):
... def __init__(self):
... print '__init__ running'
... def __new__(cls,*args, **kwargs):
... print "new %s" %cls
... print '__new__ running'
... return object.__new__(cls, *args, **kwargs)
...
>>> b=B()
new <class '__main__.B'>
__new__ running
__init__ running
可以看到是 __new__先运行 然后 __init__运行。 从这里也可以知道 __new__更类似于构造函数,而__init__只是在实例化之后用来修饰实例的
python中 __new__和__init__的更多相关文章
- Python中__new__与__init__介绍
在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...
- Python中__new__和__init__区别
__new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值 1.在类中,如果__new__和__init__同时存在,会优先调用 ...
- Python中__new__和__init__的区别与联系
__new__ 负责对象的创建而 __init__ 负责对象的初始化. __new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回 ...
- Python 中__new__()和__init__()的区别
转自: https://blog.csdn.net/weixin_37579123/article/details/89515577 __new__方法:类级别的方法 特性: 1.是在类准备将自身实例 ...
- python中self与__init__怎么解释能让小白弄懂?
python中self与__init__怎么解释能让小白弄懂? 这个问题其实没那么简单. 只说一下自己的理解. python 里所有的 object 都有三个属性, 标识(identity), 类型( ...
- Python中__new__的作用
__new__ 的作用 依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径.还 ...
- [py]python中__new__作用
元类metaclass 使劲搞,但是没搞清楚__new__的作用 了解Python元类 Python进阶:一步步理解Python中的元类metaclass Python中的__new__和__init ...
- Python中__new__()方法的使用和实例化
new()是在新式类中新出现的方法,它作用在构造方法init()建造实例之前,可以这么理解,在Python 中存在于类里面的构造方法init()负责将类的实例化,而在init()调用之前,new()决 ...
- Python中__new__方法为什么有人说是构造方法?有什么作用?
__new__方法是Python新式类引入的,通常用于控制生成一个新实例的过程.它是类级别的静态方法,是在创建实例对象前执行,如果自定义类中没有重写该方法,则Python自动调用父类的方法,当所有父类 ...
随机推荐
- codevs1312连续自然数和
1312 连续自然数和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 对于一个自然数M,求出所有的连续的自然数段 ...
- Java并发编程系列之Semaphore详解
简单介绍 我们以饭店为例,假设饭店只有三个座位,一开始三个座位都是空的.这时如果同时来了三个客人,服务员人允许他们进去用餐,然后对外说暂无座位.后来的客人必须在门口等待,直到有客人离开.这时,如果有一 ...
- python抢票开发——设备预约助手实现
女朋友是药学院的,做实验时需要在特定的网站上进行设备预约,由于预约人数过多,从而导致从浏览器登录不进去或者登录进去预约失败等情况,所以我用python帮她写了一个抢位助手,让程序自动去进行位置预定,实 ...
- C#学习-图片的处理
1.在图片上加防伪标记 private void btnAddString_Click(object sender, EventArgs e) { //以流的方式,获取一张图片 using (File ...
- Product Device Lot
Product是指产品: 这个Product可以在不同的设备类型上生产, 同一类型的设备也可能硬件有差异,所以会有相对应的Device(Recipe): 同一Product(或同一Device)由于数 ...
- csf 课件转化为wmv正常格式
1. 下载csf文件到本地:如下图 2.从下面百度网盘下载到本地: https://pan.baidu.com/s/1BBbgq n85a 3.安装并出现下面图标,点击打开 4. 运行如下图 5. ...
- html——行内元素、块元素、行内块元素
行内元素:span ,a, ,strong , em, del, ins.特点:在一行上显示:不能直接设置宽高:元素的宽和高就是内容撑开的宽高. 块元素:div,h1-h6,p,ul,li.特 ...
- 控制台——对WIN32 API的使用(user32.dll)
Win32 API概念:即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface).所有在Win32平台上运行的应用程序都可以调用这些函 ...
- [Windows Server 2008] 查看ASP详细错误信息方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:查看IIS下 ...
- 【YOLO】只检测人
一.修改源代码 cfg/coco.data classes= #修改成1 train = /home/pjreddie/data/coco/trainvalno5k.txt valid = coco_ ...