Python基础(十) __init__与__new__差距

__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()__ “构造器”方法:

当类被调用,实例化的第二步是成立实例对象。1旦指标成立了,Python
检查是还是不是贯彻了__init__()方法。暗中认可情况下,即使未有定义(或掩盖)特殊情势__init__(),对实例不会施加任何越发的操作.任何所需的一定操作,都亟待程序员已毕__init__(),覆盖它的暗中认可行为。若是__init__()未有落到实处,则赶回它的靶子,实例化进程结束。
然而,如果__init__()已经被实现,那么它将被调用,实例对象作为第多个参数(self)被传送进入,像正规方法调用一样。调用类时,传进的别样参数都交由了__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.二 就联合了,Python
用户能够对内建项目实行派生,由此,要求壹种途径来实例化不可变对象,比如,派生字符串,数字,等等。
在这种景况下,解释器则调用类的__new__()方法,贰个静态方法,并且传入的参数是在类实例化操作时生成的。__new__()会调用父类的__new__()来制造对象(向上代理)。
为什么大家觉得__new__()比__init__()更像构造器呢?那是因为__new__()必须重返三个合法的实例,那样解释器在调用__init__()时,就足以把那么些实例作为
self 传给它。调用父类的__new__()来创制对象,正像别的语言中央银行使 new
关键字一样。
__new__()和__init__()在类创建时,都流传了(相同)参数。1三.11.三节中有个例证使用了__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 3群:5632278九4

不前进,不倒退,结束的情形是从未有过的.

共同发展,与君共勉,

 

发表评论

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

网站地图xml地图