Python中__new__和__init__差异

__init__与__new__区别:

__new__:创立对象时调用,会回去当前目的的二个实例

__init__在python,其实是,在实例化之后执行的,用来初步化1些质量,约等于构造函数,然而又不等同

__init__:创立完对象后调用,对当前指标的部分实例开首化,无重回值

有心人一些,通过参数会持有察觉,其实__init__(self)
 self隐式的将,实例传过来。

1、在类中,如果__new__和__init__而且设有,会先行调用__new__

 

>>> class Data(object):
...     def __new__(self):
...             print "new"
...     def __init__(self):
...             print "init"
... 
>>> data = Data()
new

__new__在python中实际上是,在实例化从前实施的,那么些通过参数一样能够看到

2、__new__方法会重返所组织的对象,__init__则不会。__init__无重临值。

__new__(cls),cls是隐式的传递的类对象,并不是实例。因为__new__的职务正是,创制类实例并再次回到实例。

>>> class Data(object):
...     def __init__(cls):
...             cls.x = 2
...             print "init"
...             return cls
... 
>>> data = Data()
init
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() should return None, not 'Data'

>>> class Data(object):
...     def __new__(cls):
...             print "new"
...             cls.x = 1
...             return cls
...     def __init__(self):
...             print "init"
... 
>>> data = Data()
new
>>> data.x =1 
>>> data.x
1

If __new__() returns an instance of cls, then the new instance’s __init__() method will be 
invoked like __init__(self[, ...]), where self is the new instance and the remaining 
arguments are the same as were passed to __new__().

如果__new__返回一个对象的实例,会隐式调用__init__

If __new__() does not return an instance of cls, then the new instance’s __init__() method
 will not be invoked.

如果__new__不返回一个对象的实例,__init__不会被调用
class temp(object):

    def __init__(self,txt):
        self.txt = txt
        print '__init__'


    def __new__(cls,txt):
        print '__new__'
        print txt
        return super(temp,cls).__new__(cls)

temp('what?')

以下摘自《Python大旨编制程序(第二版)》:

结果:

__init()__ “构造器”方法:

当类被调用,实例化的首先步是成立实例对象。壹旦目的成立了,Python
检查是或不是落实了__init__()方法。暗许景况下,假若未有概念(或掩盖)特殊措施__init__(),对实例不会施加任何尤其的操作.任何所需的特定操作,都亟待程序员达成__init__(),覆盖它的默许行为。假诺__init__()未有达成,则赶回它的对象,实例化过程甘休。
然而,如果__init__()已经被完毕,那么它将被调用,实例对象作为第一个参数(self)被传送进入,像正规方法调用一样。调用类时,传进的任何参数都付出了__init__()。实际中,你能够想像成那样:把成立实例的调用当成是对构造器的调用。
总的说来,(a)你未有经过调用 new 来创制实例,你也远非概念3个构造器。是
Python 为您创造了对象; (b)
__init__(),是在解释器为你创设三个实例后调用的第三个措施,在你开头使用它前边,这一步可以让您做些准备工作。
__init__()是很多为类定义的奇特措施之一。当中有个别奇特格局是预定义的,缺省状态下,不实行任何操作,比如__init__(),要定制,就非得对它进行重载,还某些方法,恐怕要按要求去达成。

C:\Python27\python.exe D:/weixin/temp/abc.py
__new__
what?
__init__

Process finished with exit code 0
__new()__ “构造器”方法:

与__init__()相比,__new__()方法更像2个确实的构造器。类型和类在本子
二.二 就联合了,Python
用户可以对内建项目举办派生,因而,要求一种途径来实例化不可变对象,比如,派生字符串,数字,等等。
在那种景色下,解释器则调用类的__new__()方法,一个静态方法,并且传入的参数是在类实例化操作时生成的。__new__()会调用父类的__new__()来创设对象(向上代理)。
何以大家认为__new__()比__init__()更像构造器呢?这是因为__new__()必须重回一个官方的实例,那样解释器在调用__init__()时,就能够把那一个实例作为
self 传给它。调用父类的__new__()来创立对象,正像别的语言中使用 new
关键字一样。
__new__()和__init__()在类创立时,都流传了(相同)参数。1三.1一.③节中有个例证使用了__new__()。

<class '__main__.B'>
>>> class A(object):
...     def __new__(Class):
...             object = super(A,Class).__new__(Class)
...             print "in New"
...             return object
...     def __init__(self):
...             print "in init"
... 
>>> A()
in New
in init
<__main__.A object at 0x7fa8bc622d90>
>>> class A(object):
...     def __new__(cls):
...             print "in New"
...             return cls
...     def __init__(self):
...             print "in init"
... 
>>> a = A()      
in New

object.__init__(self[, ...])
Called when the instance is created. The arguments are those passed to the class 
constructor expression. If a base class has an __init__() method, the derived 
class’s __init__() method, if any, must explicitly call it to ensure proper initialization 
of the base class part of the instance; for example: BaseClass.__init__(self, [args...]). 
As a special constraint on constructors, no value may be returned; doing so will cause a
TypeError to be raised at runtime.

在对象的实例创建完成后调用。参数被传给类的构造函数。如果基类有__init__方法,子类必须显示
调用基类的__init__。

并未有再次来到值,不然会再吸引TypeError错误。
原文:https://www.cnblogs.com/gsblog/p/3368304.html

 

 

Linux and
python学习沟通一,二群已满.

Linux and
python学习调换三群新开,欢迎插足,壹起学习.qq 三群:5632278九四

不前进,不倒退,甘休的气象是从未的.

联合前进,与君共勉,

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图