【从零学习python 】46. Python中的__new__和__init__方法解析及单例设计模式

简介: 【从零学习python 】46. Python中的__new__和__init__方法解析及单例设计模式

__new__和__init__方法

class A(object):
    def __init__(self):
        print("这是 init 方法")
    def __new__(cls):
        print("这是 new 方法")
        return object.__new__(cls)
A()

总结

  • __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。
  • __new__必须要有返回值,返回实例化出来的实例。可以通过返回父类的__new__出来的实例,或者直接使用object__new__
  • __init__有一个参数self,就是__new__返回的实例。__init____new__的基础上可以完成一些其他初始化的动作。__init__不需要返回值。

单例设计模式

举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例类是一种对象创建型模式。

# 实例化一个单例
class Singleton(object):
    __instance = None
    __is_first = True
    def __new__(cls, age, name):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance
    def __init__(self, age, name):
        if self.__is_first:  # 不会再创建第二个对象
            self.age = age
            self.name = name
            Singleton.__is_first = False
a = Singleton(18, "张三")
b = Singleton(28, "张三")
print(id(a))
print(id(b))
print(a.age)  # 18
print(b.age)  # 18
a.age = 19
print(b.age)
  • __instance是一个类变量,用于存储单例实例。
  • __is_first是一个类变量,表示是否是第一次创建实例。
  • __new__方法在创建实例时被调用。如果__instanceNone,说明还没有创建实例,此时通过object__new__方法创建一个新实例,并将其赋值给__instance。如果__instance不为None,说明已经创建过实例,直接返回当前的__instance实例。
  • __init__方法在实例化后调用。如果是第一次创建实例,则进行初始化操作。由于第一次创建实例后__is_first被设置为False,因此后续创建的实例不会执行初始化操作。
  • 最后打印出实例ab的内存地址,发现它们是同一个实例。
  • 打印出a.ageb.age,发现它们的值都是18,说明它们共享相同的属性。
  • 修改a.age19,再次打印b.age,发现其值也是19,说明对一个实例的属性进行修改会影响到其他所有实例。
相关文章
|
15天前
|
机器学习/深度学习 存储 Python
|
18天前
|
存储 SQL 数据库
超级实用的python代码片段汇总和详细解析(16个)(下)
超级实用的python代码片段汇总和详细解析(16个)
36 0
|
14天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
3天前
|
XML 存储 数据格式
python path解析基础
python path解析基础
10 0
|
3天前
|
数据采集 Python
Python HTML解析详解
Python HTML解析详解
6 0
|
5天前
|
JSON 安全 前端开发
解析FormData格式数据:Python实践指南
解析FormData格式数据:Python实践指南
13 1
|
12天前
|
Linux API Python
【python】如何通过python来发邮件,各种发邮件方式详细解析
【python】如何通过python来发邮件,各种发邮件方式详细解析
|
12天前
|
设计模式 算法 搜索推荐
【PHP开发专栏】PHP设计模式解析与实践
【4月更文挑战第29天】本文介绍了设计模式在PHP开发中的应用,包括创建型(如单例、工厂模式)、结构型和行为型模式(如观察者、策略模式)。通过示例展示了如何在PHP中实现这些模式,强调了它们在提升代码可维护性和可扩展性方面的作用。设计模式是解决常见问题的最佳实践,但在使用时需避免过度设计,根据实际需求选择合适的设计模式。
|
12天前
|
Python
使用Python解析网页和正则表达式
使用Python解析网页涉及`requests`和`re`模块。首先导入这两个模块,然后用`requests.get()`发送HTTP请求获取URL内容。通过`.text`属性得到HTML文本。接着,利用正则表达式和`re.search()`匹配特定模式(如网页标题),并用`.group(1)`获取匹配数据。最后,对提取的信息进行处理,如打印标题。实际操作时,需根据需求调整正则表达式。
13 2
|
12天前
|
并行计算 数据处理 开发者
Python并发编程:解析异步IO与多线程
本文探讨了Python中的并发编程技术,着重比较了异步IO和多线程两种常见的并发模型。通过详细分析它们的特点、优劣势以及适用场景,帮助读者更好地理解并选择适合自己项目需求的并发编程方式。

推荐镜像

更多