目的:让类创建对象,在系统中只有唯一的一个实例。
每一次执行类名()返回的对象,内存地址是相同的
需要重写new内置方法,一定要返回return supper().new(cls)
new 为对象分配空间,返回对象的引用
init对象初始化,定义实例属性
class MusicPlayer(object):
def __new__(cls, *args, **kwargs):
# 1. 创建对象时,new 方法会被自动调用
print('创建对象, 分配空间')
# 2. 为对象分配空间
instance = super().__new__(cls)
# 3. 返回对象的引用
return instance
def __init__(self):
print('播放器初始化')
player = MusicPlayer()
print(player)
"""
创建对象, 分配空间
播放器初始化
__main__.MusicPlayer object at 0x0000000001E1E828
"""
单例:__new__
class MusicPlayer(object):
# 定义类属性记录单例对象引用
instance = None
def __new__(cls, *args, **kwargs):
# 1. 判断类属性是否为空对象
if cls.instance is None:
# 2. 调用父类方法,为第一对象分配空间
cls.instance = super().__new__(cls)
# 3. 返回类属性保存的对象引用
return cls.instance
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
"""
__main__.MusicPlayer object at 0x000000000292CBA8
__main__.MusicPlayer object at 0x000000000292CBA8
"""