zoukankan      html  css  js  c++  java
  • Python中__new__和__init__区别

    __new__:创建对象时调用,会返回当前对象的一个实例

    __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值

    1、在类中,如果__new__和__init__同时存在,会优先调用__new__

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

    2、__new__方法会返回所构造的对象,__init__则不会。__init__无返回值。

    >>> 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 '__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错误。

    http://www.cnblogs.com/itaceo-o/p/3300289.html

  • 相关阅读:
    Windows JScript 在 游览器 中运行 调试 Shell 文件系统
    autohotkey 符号链接 软连接 symbolink
    软链接 硬链接 测试
    SolidWorks 修改 基准面 标准坐标系
    手机 路径 WebDAV 映射 驱动器
    Win10上手机路径
    explorer 命令行
    单位公司 网络 封锁 屏蔽 深信 AC
    cobbler自动化部署原理篇
    Docker四种网络模式
  • 原文地址:https://www.cnblogs.com/gsblog/p/3368304.html
Copyright © 2011-2022 走看看