• 装饰器实现单例模式


    我们知道,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

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

  • 相关阅读:
    理清一下JavaScript面向对象思路
    IE的CSS渲染跟其它浏览器有什么不同
    页面元素的CSS渲染优先级
    push与createElement性能比较
    关于JavaScript的push()函数
    关于JavaScript的沙箱模式
    JavaScript SandBox沙箱设计模式
    用live()方法给新增节点绑定事件
    深入JavaScript对象创建的细节
    Keras class_weight和sample_weight用法
  • 原文地址:https://www.cnblogs.com/zxmbky/p/10218474.html
Copyright © 2020-2023  润新知