Python学习--单例

01单例设计模式

设计模式

        -设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一

          特定问题的成熟的解决方案

        -使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性

单例设计模式

        -目的--让创建的对象,在系统中只有为的一个实例

        -每一次执行类名()返回的对象,内存地址是相同的

02__new__方法

 -使用类名()创建对象时,Python的解释器首先会调用__new__方法为对象分配空间

-__new__是一个由object基类提供的内置的静态方法,主要作用有两个

        1)在内存中为对象分配空间

        2)返回对象的引用

-Python的解释器获得对象的引用后,将引用作为第一个参数,传递给__Init__方法 

                重写__new__方法的代码非常固定

-重写__new__方法一定要return super().__new__(cls)

-否则Python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法

-注意:__new__是一个静态方法,在调用时需要主动传递cls参数

class A(object):
    def __init__(self):
        print("程序初始化")

    def __new__(cls, *args, **kwargs):  # 不经过处理,每次都会调用__new__获取一新的地址
        print("分配地址")
        instance = super().__new__(cls)
        return instance


a = A()
b = A()
print(a)
print(b)

经过处理:

class A(object):
    instance = None

    def __init__(self):
        print("程序初始化")

    def __new__(cls, *args, **kwargs):# 判断是否是第一次调用,时则给个地址不是则用之前记录的地址
        print("分配地址")
        if A.instance is None:
            A.instance = super().__new__(cls)
        return A.instance


a = A()
b = A()
print(a)
print(b)

只执行一次初始化工作:

        -在每次使用 类名() 创建对象时,Python的解释器都会自动调用两个方法

                1、__new__分配空间

                2、__init__对象初始化

        -虽然上面通过对__new__方法改造,每次都会得到第一次被创建对象的引用

        -但是:初始化方法还是会被再次调用

如何让初始化动作只被执行一次呢:

        1、定义一个类属性,init_flag标记是否执行过初始化动作,初始值为False

        2、在__init__方法中,判断init_flag,如果为False就执行初始化动作

        3、然后将init_flag设置为True

        4、这样,再次自动调用__init__方法时,初始化动作就不会再次被执行了

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

    def __new__(cls, *args, **kwargs):
        print("分配地址")
        if A.instance is None:
            A.instance = super().__new__(cls)
        return A.instance

    def __init__(self):
        if A.init_flag:
            return
        print("程序初始化")
        A.init_flag = True


a = A()
b = A()
print(a)
print(b)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值