首页 > 编程语言 >深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法

深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法

时间:2023-12-19 16:06:27浏览次数:39  
标签:__ 初始化 Python 对象 init 实例 new

Python 中的面向对象编程涉及许多特殊方法,其中 __new____init__ 是两个关键的方法。它们分别负责对象的创建和对象的初始化,在对象的生命周期中扮演着不同而又互补的角色。让我们深入探讨这两个方法,了解它们的作用、区别以及如何在实际开发中应用。

1 . __new__ 方法

当谈到 Python 中的 __new__ 方法时,它是一个特殊的方法,用于创建对象实例。与 __init__ 不同,__new__ 是在对象实例化之前被调用的方法。它的主要目的是创建一个新的实例,并返回这个实例。这个方法通常在你需要控制对象创建过程或者需要定制实例化行为时被使用。

1.1. 作用和特性

  1. 创建对象实例
  • __new__ 负责实例的创建。在对象实例化时,它是第一个被调用的方法。
  • 它是一个类方法(类方法使用cls作为第一个参数),因此在调用时使用类本身而不是实例。
  1. 返回实例
  • __new__ 必须返回一个实例。这个实例通常是由 super().__new__(cls) 创建的,即调用父类的 __new__ 方法。
  1. 通常情况下,你不需要直接调用它,因为它在实例化时自动被调用。
class MyClass:
    def __new__(cls, *args, **kwargs):
        instance = super().__new__(cls)
        # 执行一些初始化操作
        return instance

1.2. 使用场景和示例

1. 控制对象创建过程

有时候,我们需要在对象创建之前做一些额外的操作或者控制对象的创建行为,这时就可以用到 __new__

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # 输出 True,因为 Singleton 类只创建了一个实例

2. 修改对象的创建方式

__new__ 方法也可以被用来修改对象的创建方式,甚至可以返回与当前类无关的对象。

class CustomList(list):
    def __new__(cls, *args):
        # 只返回偶数的列表
        return super().__new__(cls, [arg for arg in args if arg % 2 == 0])

custom_list = CustomList(1, 2, 3, 4, 5)
print(custom_list)  # 输出 [2, 4]

3. 定制不可变对象

通过 __new__ 方法,可以创建不可变对象。例如,创建一个自定义的元组类,使其成为不可变对象。

class ImmutableList(tuple):
    def __new__(cls, *args):
        return super().__new__(cls, args)

immutable_list = ImmutableList(1, 2, 3)
# immutable_list[0] = 5  # 这里会抛出异常,因为元组是不可变的

1.3. __new__ 方法总结

__new__ 方法允许我们在对象创建之前进行操作和定制,它控制了对象的实例化过程。虽然通常情况下你可能不需要直接使用 __new__,但了解它的作用和用法对于理解 Python 对象创建机制非常重要。

2. __init__ 方法

__init__ 是 Python 中用于初始化对象的特殊方法之一。与 __new__ 方法不同,__init__ 方法在对象实例已经创建后被调用,负责对实例进行初始化,给对象赋予初始状态和属性。

2.1. 主要作用和特性

  1. 初始化对象属性
  • __init__ 负责对象实例的初始化。它可以在对象创建后,对实例的属性进行赋值操作。
  1. 对象初始化
  • 在对象创建后,Python 解释器会自动调用 __init__ 方法进行对象的初始化。
  • 它通常接收除了类定义中的参数之外的其他参数。

2.2. 使用场景和示例

1. 初始化对象属性

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person('Alice', 30)
print(person.name, person.age)  # 输出 Alice 30

2. 对象属性赋值

__init__ 中可以对对象的属性进行赋值,从而在对象创建后就具有相应的属性。

3. 处理额外参数

除了类定义中的参数之外,__init__ 方法还可以接收其他参数,并在对象初始化时处理这些参数。

class Car:
    def __init__(self, make, model, **kwargs):
        self.make = make
        self.model = model
        for key, value in kwargs.items():
            setattr(self, key, value)

car = Car('Toyota', 'Prius', year=2020, color='blue')
print(car.make, car.model, car.year, car.color)  # 输出 Toyota Prius 2020 blue

4. 初始化其他对象或资源

__init__ 中也可以执行一些初始化其他对象或资源的操作。

class DatabaseConnection:
    def __init__(self, db_name):
        # 初始化数据库连接
        self.db_name = db_name
        # 执行其他初始化操作

db_connection = DatabaseConnection('my_db')

2.3. __init__ 方法总结

__init__ 方法是在对象创建后,用于初始化对象的重要方法。它使得我们能够在对象创建时赋予属性初始值、处理额外参数或执行其他初始化操作。了解和善用 __init__ 方法可以让你更有效地管理对象的初始化过程。

3. 区别:

3.1. 作用时间:

  • __new__ 是在对象实例化时被调用,负责创建对象实例,返回实例。
  • __init__ 是在对象实例创建之后被调用,负责对实例进行初始化,给对象赋予初始状态和属性。

3.2. 返回值:

  • __new__ 方法的返回值应该是一个新的对象实例,通常使用 super().__new__(cls) 来创建实例,并返回它。
  • __init__ 方法没有显式的返回值要求,它用于对已经存在的实例进行初始化。

3.3. 参数:

  • __new__ 方法是一个类方法(静态方法),它接收类本身作为第一个参数(通常是 cls),用于创建对象。
  • __init__ 方法是一个实例方法,接收实例对象本身作为第一个参数(通常是 self),用于初始化对象的属性。

3.4. 功能:

  • __new__ 负责对象的创建,它可以用于控制对象创建的过程,返回不同类型的实例,甚至可以返回其他类的实例。
  • __init__ 负责对象的初始化,给对象赋予初始属性,用传入的参数对对象进行设置和初始化。

3.5. 示例:

  • 举例1:使用 __new__ 控制对象的创建行为,实现单例模式:
class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # 输出 True,因为 Singleton 类只创建了一个实例
  • 举例2:使用 __init__ 对对象进行初始化,给对象赋予属性:
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person('Alice', 30)
print(person.name, person.age)  # 输出 Alice 30

3.6. 区别总结:

__new____init__ 分别在对象创建和对象初始化时起作用。__new__ 负责对象的创建,__init__ 负责对象的初始化。理解这两者之间的区别有助于更好地控制对象的创建和初始化过程,并根据需要进行定制化的操作。

4. 总结

__new____init__ 方法作为 Python 中对象创建和初始化的关键部分,为我们提供了控制对象实例化和初始化的能力。了解这两个方法之间的差异以及它们各自的功能,能够让我们更加灵活地定制对象的创建和初始化过程。在实际编码中,合理利用这两个方法,可以更加高效地管理对象的创建、初始化以及整个对象的生命周期。深入理解这些特殊方法,将有助于编写更清晰、更灵活的 Python 代码。


标签:__,初始化,Python,对象,init,实例,new
From: https://blog.51cto.com/u_16170163/8890237

相关文章

  • 可视化场景及解读
    数合建模及可视化是款免费的数据建模及可视化工具,那么什么是可视化呢?数据可视化有很多种方式,不同的图表可以展示出数据不同的特征:一、趋势类折线图,适合展示一段时间内的趋势,可以使用多条线来展示多个组的趋势。二、关系,数据中变量之间的关系条形图,适用于比较不同组对应的数量。饼图......
  • 中学生教育营销文案怎么写?挖卖点才能戳中痛点
    招生宣传文案效果好坏,取决于招生宣传文案能否体现教育产品卖点、戳到学习者的痛点。教育产品一旦找到好的卖点,招生量就会直线上升;反之,教育产品卖点不突出,招生宣传文案做得再精美,也无法打动学习者。许多招生宣传文案创作人员在面对教育产品时,都会面临教育产品卖点提炼这个难题。好......
  • 11个linux命令
    1.sudo!!命令没有特定输入sudo命令而运行,将给出没有权限的错误。那么,你不需要重写整个命令,仅仅输入’!!‘就可以抓取最后的命令。$ apt-get updateE: Could not openlock file /var/lib/apt/lists/lock - open (13: Permission denied)E: Unable to lock direct......
  • 车载无刷电机吸尘器方案
     无刷电机吸尘器是一款采用无刷电机驱动的高性能清洁工具,以其出色的吸尘效果和便捷的使用方式,受到了广大用户的欢迎。相比传统的有刷电机吸尘器,它具有更高的效率、更长的使用寿命和更低的噪音。下面,将为大家详细介绍无刷电机吸尘器方案的功能。 一、无刷电机吸尘器功能介绍......
  • 解决安卓设备无法使用authenticator app问题
    今天要说的是微软的authenticatorapp在中国的使用问题,众所周知的是,微软和很多厂商现在都在大力推广passwordless的身份验证方式,认为username和password已经不再安全,属于要慢慢摒弃的旧方法,至于哪些身份验证方式比较安全,微软心目中认定的身份验证的级别可以参考下图可以看到authent......
  • 超越巨头:Zephyr-7B领跑7B级模型竞赛,开源且笔记本可运行
    引言在AI界的大语言模型(LLM)竞赛中,Zephyr-7B作为HuggingFaceH4团队的最新力作,展现了令人瞩目的技术突破。它不仅性能超越了700亿参数的LLaMA2模型,更引人注目的是,这一开源模型可在常规笔记本电脑上运行,极大地提高了AI技术的可达性。技术背景Zephyr-7B基于MistralAI的开源大模型Mis......
  • 端口错误配置:开放了不应该开放的端口,增加安全风险
    **防火墙策略管理、分析与解决方案:端口错误配置与安全风险****一、引言**在计算机网络安全领域,防火墙是一种重要的防护设备,它可以有效控制进出网络的数据传输,防止未经授权的访问和恶意攻击。然而,如果防火墙的配置不当,可能会造成安全风险。本文将讨论如何通过合理的管理策略和分......
  • plotly作图时如何让x轴刻度与y轴刻度一致
    Plotly是一款功能强大的数据可视化工具,它提供了丰富的图表类型和定制选项。在使用Plotly作图时,有时我们希望x轴和y轴的刻度能够保持一致,以便更好地展示数据的比例和相关性。本文将介绍如何使用Plotly来实现x轴刻度和y轴刻度的一致性。1.设置坐标轴范围:要让x轴和y轴的刻度一致,首先需......
  • 羚通视频智能分析平台厨房视频监控 抽烟、玩手机检测算法预警
    羚通视频智能分析平台是一款基于人工智能技术的厨房视频监控系统,旨在实时监测厨房内工作人员的行为,包括抽烟、玩手机等违规行为。该系统通过算法预警功能,提醒管理人员及时采取措施,确保厨房的安全。一、系统功能:1.实时监控:羚通视频智能分析平台通过摄像头对厨房进行24小时不间断......
  • 使用XPath进行网页爬取的Python实现
    XPath是一种用于在XML和HTML文档中进行导航和查询的语言。在网页爬取中,XPath可以帮助我们定位和提取特定的网页元素,从而实现数据的抓取和提取。本文将介绍如何使用Python中的XPath库来进行网页爬取。1.安装依赖库:在使用XPath进行网页爬取之前,我们需要安装相关的依赖库。Python中常......