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

python基础之单例模式

时间:2019-06-13 22:04:57      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:none   spl   func   int   onclick   hid   metaclass   d3d   cal   

单例模式是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.

单例模式的要点三个:

  --某个类智能有一个实例

  --他必须自行创建这个实例

  --必须自行向整个系统提供这个实例

在python中,我们可以用多种方法来实现单例模式:

  •   使用模块
  •        使用__new__
  •        使用装饰器(decorator)
  •         使用元类(metaclass)

使用模块                                                                                                

python的模块就是天然的单例模式

技术图片
class Myclass(object):
    def foo(self):
        print(Myclass.foo)
my_class_obj=Myclass()
fx.py
from fx import my_class_obj

my_class_obj.foo()

使用__new__                                                                                         

技术图片
class Myclass(object):
    _instance =None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance=super(Myclass, cls).__new__(cls,*args,**kwargs)
        return cls._instance
#我们将类的实例和一个类变量_instance关联起来,如果cls._instance为None则创建实例,否者直接返回cls._instance
class Herclass(Myclass):
    a=1

one=Herclass()
two=Herclass()
print(one==two)
print(one is two)
print(id(one),id(two))
__new__

使用装饰器                                                                                              

技术图片
from functools import wraps

def sin(cls):
    instances={}

    @wraps(cls)
    def get(*args,**kwargs):
        if cls not in instances:
            instances[cls] =cls(*args,**kwargs)
        return instances[cls]

@sin
class Myclass(object):
    a =1

#我们定义了一个装饰器sin,他返回了一个内部函数get,该函数会判断某一个类是否在字典instance中,如果不存在,就会将cls
#作为key,cls(*args, **kw) 作为 value 存到 instances 中,否则,直接返回 instances[cls]。
装饰器

使用__metaclass__                                                                               

元类可以控制类的创建过程,三件事:

  ---拦截类的创建

  ---修改类的定义

  ---返回修改后的类

技术图片
import threading


class Singleton2(type):
    def __init__(cls, name, bases, dict):
        super(Singleton2, cls).__init__(name, bases, dict)
        cls._instance = None

    def __call__(cls, *args, **kw):
        if cls._instance is None:
            cls._instance = super(Singleton2, cls).__call__(*args, **kw)
        return cls._instance

#python2
class MyClass(object):
    __metaclass__ = Singleton2


one = MyClass()
two = MyClass()
two.a = 3

#print one.a
# 3
#print id(one)
# 31495472
#print id(two)
# 31495472
__metaclass__

 

python基础之单例模式

标签:none   spl   func   int   onclick   hid   metaclass   d3d   cal   

原文地址:https://www.cnblogs.com/tianshuai1/p/11019703.html

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