Python中__new__和__init__的区别与联系

 更新时间:2021年05月05日 13:17:09   投稿:WDC  
这篇文章主要介绍了Python中__new__和__init__的区别与联系,需要的朋友可以参考下

__new__ 和 __init__ 的区别主要表现在:

__new__ 负责对象的创建而 __init__ 负责对象的初始化。

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

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

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

class ClsTest(object):    def __init__(self):        print("init")    def __new__(cls,*args, **kwargs):        print("new")ClsTest()

输出:

new

2. 如果__new__返回一个对象的实例,会隐式调用__init__

代码实例:

class ClsTest(object):    def __init__(self):        print ("init")    def __new__(cls,*args, **kwargs):        print ("new %s"%cls)        return object.__new__(cls, *args, **kwargs)ClsTest()

输出:

new <class '__main__.ClsTest'>init

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

class ClsTest(object):     def __init__(cls):             cls.x = 2             print ("init")             return clsClsTest()

输出:

initTraceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: __init__() should return None, not 'ClsTest'

4. 若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行

class ClsTest1(object):    passclass ClsTest2(ClsTest1):    def __init__(self):        print ("init")    def __new__(cls,*args, **kwargs):        print ("new %s"%cls)        return object.__new__(ClsTest1, *args, **kwargs)b=ClsTest2()print (type(b))

 输出:

new <class '__main__.ClsTest2'>

<class '__main__.ClsTest1'>

知识点:

1. 继承自object的新式类才有__new__

2. __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供,__new__必须要有返回值,返回实例化出来的实例,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

3. __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

4. 如果__new__返回一个对象的实例,会隐式调用__init__

更多关于Python中__new__和__init__的区别与联系的介绍请查看下面的相关链接

相关文章

  • python将一个英文语句以单词为单位逆序排放的方法

    python将一个英文语句以单词为单位逆序排放的方法

    今天小编就为大家分享一篇python将一个英文语句以单词为单位逆序排放的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python爬虫包BeautifulSoup简介与安装(一)

    Python爬虫包BeautifulSoup简介与安装(一)

    这篇文章主要为大家详细介绍了Python爬虫包BeautifulSoup的简介与安装,具有一定的参考价值,感兴趣的朋友可以参考一下
    2018-06-06
  • Windows64x下VScode下载过程

    Windows64x下VScode下载过程

    这篇文章主要介绍了Windows64x下VScode下载,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • keras的ImageDataGenerator和flow()的用法说明

    keras的ImageDataGenerator和flow()的用法说明

    这篇文章主要介绍了keras的ImageDataGenerator和flow()的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • python爬虫破解字体加密案例详解

    python爬虫破解字体加密案例详解

    这篇文章主要介绍了python爬虫破解字体加密案例详解,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • numpy ndarray 按条件筛选数组,关联筛选的例子

    numpy ndarray 按条件筛选数组,关联筛选的例子

    今天小编就为大家分享一篇numpy ndarray 按条件筛选数组,关联筛选的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python实现计算图像RGB均值方式

    Python实现计算图像RGB均值方式

    这篇文章主要介绍了Python实现计算图像RGB均值方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python生成截图选餐GIF动画

    Python生成截图选餐GIF动画

    本篇文章主要介绍了Python生成截图选餐GIF动画,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Python生成rsa密钥对操作示例

    Python生成rsa密钥对操作示例

    这篇文章主要介绍了Python生成rsa密钥对操作,涉及Python rsa加密与密钥生成相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • 浅谈Python中函数的定义及其调用方法

    浅谈Python中函数的定义及其调用方法

    今天小编就为大家分享一篇浅谈Python中函数的定义及其调用方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论