- 单例设计模式
- 目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例
- 每一次执行
类名()
返回的对象,内存地址是相同的
02. __new__
方法
-
使用 类名() 创建对象时,
Python
的解释器 首先 会 调用__new__
方法为对象 分配空间 __new__
是一个 由
```
object
```
基类提供的
内置的静态方法
,主要作用有两个:
- 1) 在内存中为对象 **分配空间**
- 2) **返回** 对象的引用
-
Python
的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给__init__
方法
重写
__new__
方法 的代码非常固定!
- 重写
__new__
方法 一定要return super().__new__(cls)
- 否则 Python 的解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法
- 注意:
__new__
是一个静态方法,在调用时需要 主动传递cls
参数
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# _Version__: python 3.8.3
# __date__ : 2021/1/30
class MusicPlayer:
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)
out:
<__main__.MusicPlayer object at 0x000001B9CBE4A2E0>
<__main__.MusicPlayer object at 0x000001B9CBE4A2E0>
-
初始化只执行一次
class MusicPlayer: instance = None init_flag = False def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super().__new__(cls) return cls.instance def __init__(self): if self.init_flag: return self.init_flag = True print('初始化') player1 = MusicPlayer() player2 = MusicPlayer() print(player1) print(player2)
out:
初始化
<__main__.MusicPlayer object at 0x0000019C972B63A0>
<__main__.MusicPlayer object at 0x0000019C972B63A0>
网友评论