详解Python中__new__和__init__的区别与联系

 更新时间:2023年12月18日 16:26:40   作者:傻啦嘿哟  
在Python中,每个对象都有两个特殊的方法:__new__和__init__,本文将详细介绍这两个方法的不同之处以及它们之间的联系,具有一定的参考价值,感兴趣的可以了解一下

在Python中,每个对象都有两个特殊的方法:__new__和__init__。这两个方法在对象的创建和初始化过程中起着重要的作用,但它们的功能和用法有所不同。本文将详细介绍这两个方法的不同之处以及它们之间的联系。

一、区别

1、功能上的区别

__new__方法是Python中的一个魔术方法(Magic Method),用于创建一个新的对象实例。当我们在Python中创建一个对象时,实际上是调用了__new__方法来创建一个新的对象实例,然后再调用__init__方法来初始化这个对象。

__init__方法是Python中的一个普通方法,用于初始化一个已经存在的对象。当我们使用__new__方法创建一个新的对象实例后,就会调用这个对象的__init__方法来对对象进行初始化。

2、参数上的区别

__new__方法通常需要两个参数:第一个参数是类(class),第二个参数是传入的参数列表(args)。__new__方法的返回值是一个新的对象实例。

__init__方法通常需要三个参数:第一个参数是类(class),第二个参数是对象实例(self),第三个参数是传入的参数列表(args)。__init__方法的返回值是None。

3、调用时机上的区别

__new__方法在创建对象时被调用,它的调用时机是在__init__方法之前。__new__方法的返回值是一个新的对象实例,这个实例会被传递给__init__方法进行初始化。

__init__方法在对象被创建后被调用,它的调用时机是在__new__方法之后。__init__方法用于对已经存在的对象进行初始化,它的参数列表通常包括传递给类的构造函数的参数。

二、联系

1、共同作用

虽然__new__和__init__在功能上有所不同,但它们共同作用来创建和初始化一个对象。没有__new__方法,我们就无法创建新的对象实例;没有__init__方法,我们就无法对已经存在的对象进行初始化。

2、相互依赖

在Python中,通常情况下我们不需要重写(Override)__new__方法,因为Python的内置机制已经足够强大。但是,如果我们想要自定义对象的创建过程,就需要重写__new__方法。在重写__new__方法时,我们需要调用内置的object.__new__()方法来创建一个新的对象实例,然后再调用自定义的__init__方法来对对象进行初始化。

同样地,如果我们想要自定义对象的初始化过程,就需要重写__init__方法。在重写__init__方法时,我们需要传递类和对象实例作为第一个和第二个参数,然后传递传入的参数列表作为第三个参数。在初始化对象时,我们可以使用这些参数来设置对象的属性或执行其他初始化操作。

3、协同工作

在实际应用中,我们通常会同时使用__new__和__init__方法来创建和初始化一个对象。例如,在定义一个类时,我们可以同时定义这两个方法来控制对象的创建和初始化过程。通过合理地组织这两个方法的逻辑,我们可以实现更加灵活和强大的对象创建和初始化功能。

三、示例代码

下面是一个示例代码,展示了如何重写__new__和__init__方法来创建和初始化一个自定义的类:

class MyClass:  
    def __new__(cls, *args, **kwargs):  
        instance = super().__new__(cls)  # 调用内置的object.__new__()方法创建对象实例  
        return instance  
      
    def __init__(self, name):  
        self.name = name  # 设置对象的属性name  
      
    def say_hello(self):  
        print(f"Hello, my name is {self.name}!")  # 定义一个方法来打印对象的属性name

在这个示例中,我们定义了一个名为MyClass的类,并重写了它的__new__和__init__方法。在重写的__new__方法中,我们调用了内置的object.new()方法来创建一个新的对象实例。然后,我们返回这个实例作为结果。在重写的__init__方法中,我们设置了一个名为name的属性,并定义了一个名为say_hello的方法来打印这个属性的值。

当我们创建一个MyClass的实例时,就会调用这两个方法来创建和初始化这个实例。例如,我们可以使用以下代码来创建一个MyClass的实例,并调用它的say_hello方法:

my_instance = MyClass("Alice")  
my_instance.say_hello()  # 输出:Hello, my name is Alice!

在这个示例中,我们首先创建了一个名为my_instance的MyClass实例,并传递了一个字符串参数"Alice"给它的构造函数。然后,我们调用了my_instance的say_hello方法来打印它的name属性。

通过这个示例,我们可以看到__new__和__init__方法在Python中的重要作用。它们共同作用来创建和初始化一个对象,使我们能够更加灵活地控制对象的创建和初始化过程。

总结

通过本文的介绍,我们深入了解了Python中__new____init__方法的不同之处以及它们之间的联系。这两个方法在对象的创建和初始化过程中起着重要的作用,它们共同作用来创建和初始化一个对象。通过合理地组织这两个方法的逻辑,我们可以实现更加灵活和强大的对象创建和初始化功能。

在实际应用中,我们通常会同时使用__new____init__方法来创建和初始化一个对象。通过重写这两个方法,我们可以自定义对象的创建和初始化过程,从而实现更加灵活和强大的功能。

总之,掌握Python中的__new____init__方法对于编写高质量的Python代码非常重要。

到此这篇关于详解Python中__new__和__init__的区别与联系的文章就介绍到这了,更多相关Python __new__和__init__内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python爬虫利器之PhantomJS详解

    Python爬虫利器之PhantomJS详解

    这篇文章主要介绍了Python爬虫利器之PhantomJS详解,PhantomJS是一个基于WebKit的无头浏览器,它没有图形界面,但是它可以像传统的浏览器一样访问web页面,并返回已呈现的内容,PhantomJS是一种命令行工具,可以用它来测试和爬取Web页面,需要的朋友可以参考下
    2023-09-09
  • 一文带你掌握Python中的基础语法和核心概念(新手入门)

    一文带你掌握Python中的基础语法和核心概念(新手入门)

    无论你是编程新手还是有经验的开发者,Python都是一门值得学习的语言,本篇博客将带你从零开始,系统地掌握Python的核心语法,为你未来的编程之路打下坚实的基础
    2026-04-04
  • python实现最大优先队列

    python实现最大优先队列

    这篇文章主要为大家详细介绍了python实现最大优先队列,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Python响应对象text属性乱码解决方案

    Python响应对象text属性乱码解决方案

    这篇文章主要介绍了Python响应对象text属性乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • python中使用pyhook实现键盘监控的例子

    python中使用pyhook实现键盘监控的例子

    这篇文章主要介绍了python中使用pyhook实现键盘监控的例子,包含pyhook的下载地址和手册地址及一个Windows下的监控实例,需要的朋友可以参考下
    2014-07-07
  • python基于pyppeteer制作PDF文件

    python基于pyppeteer制作PDF文件

    这篇文章主要介绍了python基于pyppeteer制作PDF文件的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • 解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)

    解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)

    这篇文章主要介绍了Pycharm双击图标启动不了(JetBrains全家桶通用),本文给大家分享问题及解决方法,需要的朋友可以参考下
    2020-08-08
  • Python使用pptx实现复制页面到其他PPT中

    Python使用pptx实现复制页面到其他PPT中

    这篇文章主要为大家详细介绍了python如何使用pptx库实现从一个ppt复制页面到另一个ppt里面,文中的示例代码讲解详细,感兴趣的可以尝试一下
    2023-02-02
  • Tensorflow加载Vgg预训练模型操作

    Tensorflow加载Vgg预训练模型操作

    这篇文章主要介绍了Tensorflow加载Vgg预训练模型操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python中windows链接linux执行命令并获取执行状态的问题小结

    python中windows链接linux执行命令并获取执行状态的问题小结

    这篇文章主要介绍了python中windows链接linux执行命令并获取执行状态,由于工具是pyqt写的所以牵扯到用python链接linux的问题,这里记录一下一些碰到的问题,需要的朋友可以参考下
    2022-11-11

最新评论