• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ellaha
博客园    首页    新随笔    联系   管理    订阅  订阅
装饰器和单例模式

1,通过装饰器实现单例模式,只要任意一个类使用该装饰器装饰,那么就会变成一个单例模式的类

解释:这个类被装饰器装饰完之后,这个类变指向了装饰器的内层函数fun,那么再通过

t1 = MyTest()并没有创建对象,而是调用了函数t1 = fun(),那么对象只能在装饰器内部实现并赋值给t1
def single(cls):
  # 不建议用列表,因为不确定返回哪个对象
  # 使用私有属性更安全,公有属性在外部可以被任意改值 __instance
= {}

def fun(*args, **kwargs): if cls in __instance: return __instance[cls] else:
       # 如果类不在字典中,通过cls创建类的实例对象并添加到这个instance字典中(cls是指向这个类的) __instance[cls]
= cls(*args, **kwargs) return __instance[cls] return fun @single # MyTest = single(MyTest) class MyTest: pass @single class Test: pass

t1 = MyTest()

2,通过类实现一个通用的装饰器,既可以装饰函数 也可以装饰类,既可以装饰有参数的 也可以装饰无参数的

class Decorator:
    
    def __init__(self, func):
        self.func = func
        
    def __call__(self, *args, **kwargs):
        print('这个是装饰器里面的功能')
        self.func()
        
@Decorator  # test = Decorator(test) 该方法被装饰完之后就生成了一个对象,那么对象如何被调用呢?通过__call__方法
def test_01(): print('--被装饰的函数--') test_01()

 

posted on 2020-12-20 17:26  ellaha  阅读(240)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3