zoukankan      html  css  js  c++  java
  • 装饰器实现单例模式

    我们知道,python中装饰器无非是对对象的重新包装,这个对象可以是函数,也可以是一个类

    @decorate
    def test():
    相当于 test = decorate(test)

    def decorate(func):
      def wrap(*args,**kwargs):
      *****
      return 
    return wrap
    View Code

    不难发现,test其实就是wrap,我们可以在wrap中实现test的逻辑,并添加一些我们想要附加的特性,这样,相当于将test包装了一下,也就是‘装饰’了一下
    由于类也可以被装饰,我们以单例模式的实现为例

    能想到的办法一

    def single01(cls):
      s=[] //这里定义了一个私有列表,也可以声明一个变量,在wrap用关键字nonlocal去调用
      def wrap(*args,**kwargs):
        if not s:
          s.append(cls(*args,**kwargs))
        return s
      return wrap
    
    @single01
    class A(object):
      def __init__(self,name):
        self.name = name
    View Code


    //试一下
    >>> a = A("tmac")
    >>> b = A("kobe")
    >>>
    >>> a is b
    True


    也可以写成将装饰器写成类的形式

    class single03(object):
      def __init__(self,cls):
        self._cls = cls
        self._instances = None;
      def __call__(self,*args):
        if not self._instances:
          self._instances = self._cls(*args)
        return self._instances
    
    //一样调用
    @single03
    class A(object):
      def __init__(self,name):
        self.name = name
    View Code

    关于单例模式,有很多更方便的方法,这里主要用来熟悉下装饰器

  • 相关阅读:
    hdu 1690
    hdu 2962
    hdu 2923
    hdu 1385
    hdu 1505
    python:获取访问访问时的响应时间
    自动化脚本编写环境部署_win7(RF)
    python操作浏览器及截图小结
    Python + Selenium 实现对页面的指定元素截图(可截长图元素)【转载】
    Linux:DNS服务器搭建及配置
  • 原文地址:https://www.cnblogs.com/zxmbky/p/10218474.html
Copyright © 2011-2022 走看看