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自动调用父类的方法,当所有父类 ...
随机推荐
- canvas做的一个写字板
<!DOCTYPE html><html><head><title>画板实验</title> <meta charset=" ...
- Java基础学习经验分享
很多人学习Java,尤其是自学的人,在学习的过程中会遇到各种各样的问题以及难点,有时候卡在一个点上可能需要很长时间,因为你在自学的过程中不知道如何去掌握和灵活运用以及该注意的点.下面我整理了新手学习可 ...
- RHEL6.5设置行号,安装GCC
vim ~/.vimrc set nu set cindent set tabstop=4 set shiftwidth=4 syntax on 安装gcc,g++编译器 ...
- 虚拟机下安装VM
Linux(CentOS 7)命令行模式安装VMware Tools 详解 [日期:2017-05-02] 来源:Linux社区 作者:Linux [字体:大 中 小] 本篇文章主要介绍了如何在Li ...
- mybatis or
这两天项目用到mybatis,碰到and or的联合查询,语句像这样的 select * from table where xxx = "xxx" and (xx1="x ...
- MVC系列学习(四)-初识Asp.NetMVC框架
注:本文章从伯乐那盗了两张图,和一些文字: 1.MVC设计模式 与 Asp.Net Mvc框架 a.MVC设计模式 MVC设计模式 是一种 软件设计模式,将业务逻辑 与 界面显示 分离,并通过某种方式 ...
- Android开发笔记(9)——初步设置Menu
转载请注明:http://www.cnblogs.com/igoslly/p/6858656.html 初步设置Menu 设置Menu,在ActionBar上添加按钮操作: 在 ...
- [Windows Server 2012] Apache+PHP安全设置
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Win20 ...
- #1003 Max Sum
http://acm.hdu.edu.cn/showproblem.php?pid=1003 给你一串数列,让你求出其中 一段连续的子数列 并且 该子数列所有数字之和最大,输出该子数列的和.起点与终点 ...
- 8、scala面向对象编程之对象
1. Object 2.伴生对象 3.让object继承抽象类 4.apply方法 5.main方法 6.用object实现枚举功能 1. Object Object,相当于class的单个实例, ...