七、面向对象之单例设计模式

一、"""单例设计模式:通俗的讲就是单个实例对象
设计模式:前人在工作中,为了做需求写代码积累的一种代码设计思想,我们根据套路来就行了
>>>>>>>
之前讲过的创建类实例对象,工作原理是这样的---调用类创建对象,解释器会自动调用__new__这个内置的静态方法为对象分配内存空间
,然后返回这个对象,再将这个对象的引用传给__init__初始化方法进行初始化。这是工作原理,但是在创建多个对象时,给对象分配
内存空间的内存地址是不一样的,也就是多个实例,接下来单例就是要将创建多个对象时,分配的内存空间的内存地址始终是唯一一个,这就叫单例
"""
这幅图是描述调用类创建对象时的工作原理:
实现单例的代码:
class Person(object):
    instance_neicun = None  # 用类属性记录创建对象时的内存地址

    def __new__(cls, *args, **kwargs):  # 重写new方法
        if cls.instance_neicun is None:
             cls.instance_neicun = super().__new__(cls)  # 用一个变量接收object类中new方法返回的内存地址,new是一个特殊的静态
                                                           #方法,调用时需要传递cls参数

        return cls.instance_neicun  # new方法需要返回一个对象,

    def __init__(self):
        print('初始化开始...')

a = Person()
print(a)
b = Person()
print(b)

输出结果:
初始化开始...
<单例设计模式.Person object at 0x0000000001730748>
初始化开始...
<单例设计模式.Person object at 0x0000000001730748>
此时你会发现,我创建俩个对象时,内存地址都是一样的!
 

二、上面的代码你会发现,初始化内容每调用一次就会输出一次,那么如果只要输出一次怎么做呢?只需要将上述代码做一点修改就可以了
class Person(object):
    instance_neicun = None  # 用类属性记录创建对象时的内存地址
    instance_flag = False  # 是否执行过初始化方法的标记

    def __new__(cls, *args, **kwargs):  # 重写new方法
        if cls.instance_neicun is None:
             cls.instance_neicun = super().__new__(cls)  # 用一个变量接收object类中new方法返回的内存地址,new是一个特殊的静态
                                                           #方法,调用时需要传递cls参数

        return cls.instance_neicun  # new方法需要返回一个对象,

    def __init__(self):
        # 判断如果初始化方法被调用过一次,就直接返回
        if Person.instance_flag is True:
            return
        # 如果没有调用过,就进行初始化
        print('初始化开始...')
        # 修改标记
        Person.instance_flag = True
        
        
a = Person()
print(a)
b = Person()
print(b)

输出结果:
初始化开始...
<单例设计模式.Person object at 0x000000000170F668>
<单例设计模式.Person object at 0x000000000170F668>
此时你会发现,创建俩个对象,只输出了一个初始化内容
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/lz-tester/p/9273164.html