单例设计模式

单例设计模式

使用类名()创建对象时,python的解释器首先会调用new方法为对象
分配空间 new是一个由object基类提供的内置的静态方法,
主要有以下两个作用:
在内存中为对象分配空间
返回对象的引用
python的解释器获得对象的引用后,将引用作为第一个参数,
传递给init方法
new:负责给对象分配空间 init(初始化方法)负责给对象初始化

要求音乐播放器只能同时播放一首歌:

class MusicPlayer(object):
    def __new__(cls, *args, **kwargs):
        # 第一个参数 cls:哪一个类调用,就传递哪一个类
        # 第二个参数 *args: 多值参数
        # 第三个参数 **kwargs: 多值的字典参数
        # 创建对象的时候,new方法会被自动调用
        print '创建对象,分配空间'

    def __init__(self):
        print '播放器初始化'
player = MusicPlayer()
print player


因为没有为初始化对象分配空间,所以不执行‘播放器初始化’

class MusicPlayer(object):
    #def __new__(cls, *args, **kwargs):
        # 第一个参数 cls:哪一个类调用,就传递哪一个类
        # 第二个参数 *args: 多值参数
        # 第三个参数 **kwargs: 多值的字典参数
    #print '创建对象,分配空间'

    def __init__(self):
        print '播放器初始化'
player = MusicPlayer()
print player


为初始化和新属性分配不同的属性:

class MusicPlayer(object):
    def __new__(cls, *args, **kwargs):
        # 第一个参数 cls:哪一个类调用,就传递哪一个类
        # 第二个参数 *args: 多值参数
        # 第三个参数 **kwargs: 多值的字典参数
        # 创建对象的时候,new方法会被自动调用
        # 重写了父类的方法
        # 1.创建对象的时候,new方法会被自动调用
        print '创建对象,分配空间'
        # 2.为对象分配空间
        instance = object.__new__(cls)
        # 3.引用对象的返回
        return instance
    def __init__(self):
        print '播放器初始化'
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2


单例:

让类创建的对象
在系统中只有唯一的一个实例

class MusicPlayer(object):
    instance = None

    def __new__(cls, *args, **kwargs):
        # 第一个参数 cls:哪一个类调用,就传递哪一个类
        # 第二个参数 *args: 多值参数
        # 第三个参数 **kwargs: 多值的字典参数
        # 创建对象的时候,new方法会被自动调用
        if cls.instance is None:
            cls.instance = object.__new__(cls)
        return cls.instance

# 一个播放器只能同时播放一首歌
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2


只执行一次初始化工作
在每次使用 类名() 创建对象时,python 的解释器都会自动调用两个方法
new 分配空间
init 对象初始化
new方法改造之后,每次都会得到第一次被创建对象的引用
但是:初始化方法还会被再次使用

需求:让初始化方法只执行一次:

class MusicPlayer(object):
    instance = None
    init_flag = False

    def __new__(cls, *args, **kwargs):
        # 第一个参数 cls:哪一个类调用,就传递哪一个类
        # 第二个参数 *args: 多值参数
        # 第三个参数 **kwargs: 多值的字典参数
        # 创建对象的时候,new方法会被自动调用
        if cls.instance is None:
            cls.instance = object.__new__(cls)
        return cls.instance

    def __init__(self):
        if MusicPlayer.init_flag:
            return
        print '初始化播放器'
        MusicPlayer.init_flag = True


# 一个播放器只能同时播放一首歌
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值