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

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

  • 相关阅读:
    团队介绍与选题报告
    实验6:开源控制器实践——RYU
    二叉搜索树的2层结点统计 (25 分)
    2020团队程学设计天梯赛-总决赛
    口罩发放 (25 分)
    九宫格输入法
    检查密码
    暑期训练10-1010
    暑期训练09-1003
    数据结构之循环队列
  • 原文地址:https://www.cnblogs.com/zxmbky/p/10218474.html
Copyright © 2011-2022 走看看