码迷,mamicode.com
首页 > 编程语言 > 详细

Python面向对象之单例模式

时间:2018-07-30 21:38:32      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:准备工作   att   模式   第一步   常用   系统   调用   就是   单例类   

单例模式(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>

 

Python面向对象之单例模式

标签:准备工作   att   模式   第一步   常用   系统   调用   就是   单例类   

原文地址:https://www.cnblogs.com/xiao-xue-di/p/9392479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!