Python中__new__和__init__差异

发布时间:2019-04-13  栏目:Python  评论:0 Comments

__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)被传送进入,像专业措施调用1样。调用类时,传进的其余参数都付出了__init__()。实际中,你可以想像成那样:把成立实例的调用当成是对构造器的调用。
一句话来说,(a)你未有经过调用 new 来创建实例,你也从未概念1个构造器。是
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个真的的构造器。类型和类在本子
二.2 就集合了,Python
用户能够对内建项目举办派生,因而,供给一种途径来实例化不可变对象,比如,派生字符串,数字,等等。
在那种场馆下,解释器则调用类的__new__()方法,2个静态方法,并且传入的参数是在类实例化操作时生成的。__new__()会调用父类的__new__()来创制对象(向上代理)。
缘何我们觉得__new__()比__init__()更像构造器呢?那是因为__new__()必须回到一个合法的实例,那样解释器在调用__init__()时,就能够把这几个实例作为
self 传给它。调用父类的__new__()来创立对象,正像其余语言中利用 new
关键字一样。
__new__()和__init__()在类成立时,都不翼而飞了(相同)参数。一3.11.3节中有个例子使用了__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学习沟通一,2群已满.

Linux and
python学习沟通三群新开,欢迎参预,一起学习.qq 三群:56322789四

不前进,不倒退,结束的情景是不曾的.

1齐前进,与君共勉,

 

留下评论

网站地图xml地图