zoukankan      html  css  js  c++  java
  • python面向对象之单例模式

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某
    一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就
    能派上用场。
    单例类:如果一个类,从头到尾只开辟了一块属于对象的空间,那么这个类就是一个单例类。
    
    
    准备工作:
    ----#__init__()方法叫初始化方法
    ----#__new__()方法叫构造方法
    
    例子:
    <1>
    class A:
        def __new__(cls, *args, **kwargs):
            print('new')
        def __init__(self):
            print('init')
    a = A()
    结果:new
    
    <2>
    class A:
        def __new__(cls, *args, **kwargs):
            print('new')
            obj = super().__new__(cls)
            return obj
        def __init__(self):
            print('init')
    a = A()
    结果:new
         init
    
    需要知道,我们实例化对象的时候,会有三个步骤:
    1.开辟一个空间,给对象
    2.把对象的空间传给self,并执行init方法
    3.将这个对象的空间返回给调用者
    
    第一步的开辟一个空间就是构造函数 __new__()来完成的。
    第二步,将对象空间传给self,我们从例子<1>可以看出,
    不返回空间,self是不会收到的,所以我们给出了例子<2>
    这样第二步就执行了。
    第三步,我们将对象的空间返回给调用者。
    
    __new__()方法在什么时候执行?
    答:在实例化之后,__init__()之前,先执行 __new__()来创建一块空间
    
    了解这些,我们就开始写一个单例类:
    单例类:如果一个类,从头到尾只开辟了一块属于对象的空间,那么这个类就是一个单例类。
    
    例子:
    <1>
    class Single:
        __INSTANCE = None
    
        def __new__(cls, *args, **kwargs):
            if not cls.__INSTANCE:
                cls.__INSTANCE = super().__new__(cls)
            return cls.__INSTANCE
    
    
    s0 = Single()
    s1 = Single()
    print(s0)
    print(s1)
    结果:
        <__main__.Single object at 0x10e7f0630>
        <__main__.Single object at 0x10e7f0630>
    
    <2>
    class Foo:
        __INSTANCE = None
    
        @classmethod
        def get_instance(cls):
            if cls.__INSTANCE:
                return cls.__INSTANCE
            else:
                cls.__INSTANCE = Foo()
                return cls.__INSTANCE
    f0 = Foo()
    f1 = Foo()
    print(f0.get_instance())
    print(f1.get_instance())
    结果:
        <__main__.Foo object at 0x10f4354e0>
        <__main__.Foo object at 0x10f4354e0>

  • 相关阅读:
    题解-bzoj1283序列 & bzoj4842 [Neerc2016]Delight for a Cat
    题解-bzoj4061 CERC-2012Farm and Factory
    题解-bzoj3569 DZY Loves Chinese II
    题解-bzoj3901 棋盘游戏
    题解-PKUWC2018 Minimax
    题解-PKUWC2018 Slay the Spire
    题解-PKUWC2018 随机算法
    题解-PKUWC2018 随机游走
    bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
    bzoj1096[ZJOI2007]仓库建设 斜率优化dp
  • 原文地址:https://www.cnblogs.com/caodneg7/p/9392920.html
Copyright © 2011-2022 走看看