菜单

Python基础(10) __init__与__new__区别

2019年4月21日 - Java

__init__与__new__区别:

__new__:创设对象时调用,会重返当前线指挥部标的二个实例

__init__在python,其实是,在实例化之后推行的,用来伊始化一些性子,相当于构造函数,不过又不雷同

__init__:创制完对象后调用,对当前目的的1部分实例开头化,无再次来到值

有心人一些,通过参数会具有察觉,其实__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大旨编制程序(第2版)》:

结果:

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

当类被调用,实例化的率先步是创设实例对象。一旦目的创立了,Python
检查是否得以实现了__init__()方法。暗中同意景况下,若是未有定义(或掩盖)特殊格局__init__(),对实例不会施加任何越发的操作.任何所需的一定操作,都亟待程序员达成__init__(),覆盖它的暗中同意行为。假使__init__()未有得以完成,则赶回它的靶子,实例化进度截至。
然而,如果__init__()已经被落成,那么它将被调用,实例对象作为第二个参数(self)被传送进入,像正规措施调用同样。调用类时,传进的其它参数都付出了__init__()。实际中,你能够想像成那样:把创立实例的调用当成是对构造器的调用。
简单来讲,(a)你未有经过调用 new 来创建实例,你也从不定义二个构造器。是
Python 为您创制了目的; (b)
__init__(),是在解释器为你创设二个实例后调用的第3个格局,在您从头使用它在此以前,这一步能够让您做些计划干活。
__init__()是多多益善为类定义的非正规形式之1。在那之中有的极度措施是预约义的,缺省状态下,不开始展览其余操作,比方__init__(),要定制,就非得对它实行重载,还有些方法,也许要按供给去贯彻。

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

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

与__init__()相比,__new__()方法更像3个的确的构造器。类型和类在本子
2.贰 就集结了,Python
用户能够对内建项目进行派生,因而,供给一种路子来实例化不可变对象,例如,派生字符串,数字,等等。
在那种情形下,解释器则调用类的__new__()方法,八个静态方法,并且传入的参数是在类实例化操作时生成的。__new__()会调用父类的__new__()来成立对象(向上代理)。
何以我们感觉__new__()比__init__()更像构造器呢?那是因为__new__()必须重临2个官方的实例,这样解释器在调用__init__()时,就足以把这么些实例作为
self 传给它。调用父类的__new__()来创设对象,正像其余语言中选拔 new
关键字同样。
__new__()和__init__()在类创设时,都传出了(同样)参数。一叁.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学习交换3群新开,接待参加,一齐学习.qq 三群:5632278玖四

不前进,不倒退,甘休的事态是绝非的.

同步发展,与君共勉,

 

相关文章

发表评论

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

网站地图xml地图