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

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

  • 相关阅读:
    通过设置P3P头来实现跨域访问COOKIE
    随心所欲玩复制 详解robocopy
    MySQL的mysqldump工具的基本用法
    uvm_void 寂静的空宇
    Chisel语言
    IP-XACT IP IEEE交换格式
    SystemC简介
    ( 转)UVM验证方法学之一验证平台
    (转)让你彻底理解:静态时序分析
    (转)存储芯片入门漫谈
  • 原文地址:https://www.cnblogs.com/zxmbky/p/10218474.html
Copyright © 2011-2022 走看看