zoukankan      html  css  js  c++  java
  • Python_中__init__和__new__的异同

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

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

    代码示例:

    >>> class Data(object):
        def __init__(cls):
            cls.x = 2
            print "init"
            return cls    ###在init中不可用
    
        
    >>> data = Data()
    init
    
    Traceback (most recent call last):
      File "<pyshell#100>", line 1, in <module>
        data = Data()
    TypeError: __init__() should return None, not 'Data'
    
    >>> class Data(object):
        def __new__(cls):
            cls.x = 3
            print "new"
            return cls
    
        
    >>> data = Data()
    new
    >>> data.x
    3

    由上可见,__new__方法会返回所构造的对象,__init__则不会,__init__无返回值

    2:再类中,若__new__和__init__同时存在时,先调用__new__

    代码示例:

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

    3: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 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 0x0215CD70>
    >>> class B(object):
        def __new__(cls):
            print "in new"
            return cls
        def __init__(self):
            print "in init"
    
            
    >>> b=B()
    in new
    每天多一点提高,给自己一些激励,开心生活,用编码来丰富我的生活,加油! ↖(^ω^)↗
  • 相关阅读:
    教你做一个牛逼的DBA(在大数据下)
    分区扫描执行计划分析简介
    远程桌面无法复制粘贴
    测试链接服务器sql 语句
    webservice 测试窗体只能用于来自本地计算机的请求
    win2003浏览器提示是否需要将当前访问的网站添加到自己信任的站点中去
    如何在excel中把汉字转换成拼音
    关于update set from where
    添加链接服务器的代码
    「android」as过滤svn文件
  • 原文地址:https://www.cnblogs.com/graceting/p/3621131.html
Copyright © 2011-2022 走看看