Python中__new__和__init__不一致

密切一些,通过参数会怀有发现,其实__init__(self)
 self隐式的将,实例传过来。

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

一路前行,与君共勉,

2、__new__方法会再次来到所组织的靶子,__init__则不会。__init__无再次来到值。

 

1、在类中,如果__new__和__init__并且存在,会先行调用__new__

__init__与__new__区别:

__new__:创设对象时调用,会回到当前目标的1个实例

 

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

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

__init__在python,其实是,在实例化之后执行的,用来初始化一些特性,约等于构造函数,不过又差别等

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

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

>>> 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__不会被调用

__new__(cls),cls是隐式的传递的类对象,并不是实例。因为__new__的职分就是,成立类实例并重回实例。

__init__:创造完对象后调用,对近年来目的的1些实例起首化,无重临值

Linux and
python学习交换壹,二群已满.

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

当类被调用,实例化的率先步是创办实例对象。一旦指标创制了,Python
检查是还是不是落到实处了__init__()方法。私下认可意况下,就算未有定义(或掩盖)特殊格局__init__(),对实例不会施加任何尤其的操作.任何所需的一定操作,都需求程序员完毕__init__(),覆盖它的暗许行为。借使__init__()没有落实,则赶回它的对象,实例化进程甘休。
然而,如果__init__()已经被完毕,那么它将被调用,实例对象作为第二个参数(self)被传送进入,像专业措施调用1样。调用类时,传进的其他参数都付出了__init__()。实际中,你能够想像成那样:把创制实例的调用当成是对构造器的调用。
一言以蔽之,(a)你从未经过调用 new 来创设实例,你也尚无定义二个构造器。是
Python 为您创建了对象; (b)
__init__(),是在解释器为你创立多少个实例后调用的率先个艺术,在您从头利用它在此以前,这一步能够让你做些准备干活。
__init__()是无数为类定义的出格格局之一。个中壹些与众分化措施是预定义的,缺省处境下,不开始展览任何操作,比如__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?')

 

__new__在python中其实是,在实例化以前实施的,这几个通过参数壹样能够看看

结果:

 

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

Process finished with exit code 0

Linux and
python学习交换三群新开,欢迎参加,1起学习.qq 3群:5632278玖四

发表评论

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

网站地图xml地图