Python中的单例模式——装饰器实现剖析

Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性。

单例模式定义:具有该模式的类只能生成一个实例对象。

先将代码写上

  #创建实现单例模式的装饰器

1  def singleton (cls, *args, **kwargs):

2    instances = {}

3    def get_instance (*args, **kwargs):

4      if cls not in instances:

5        instances[cls] = cls(*args, **kwargs)

6      return instances[cls]

7    return get_instance

代码分析:第1行,创建外层函数singleton,可以传入类

     第2行,创建一个instances字典用来保存单例

       第3行,创建一个内层函数来获得单例

       第4,5,6行, 判断instances字典中是否含有单例,如果没有就创建单例并保存到instances字典中,然后返回该单例

       第7行, 返回内层函数get_instance

  #创建一个带有装饰器的类

  @singleton

  class Student:

    def __init__(self, name, age):

      self.name = name

      self.age = age

在Python中认为“一切皆对象”,类(元类除外)、函数都可以看作是对象,既然是对象就可以作为参数在函数中传递,我们现在来调用Student类来创建实例,看看实现过程。

#创建student实例

student = Student(jiang, 25)

@singleton相当于Student = singleton(Student),在创建实例对象时会先将 Student 作为参数传入到 singleton 函数中,函数在执行过程中不会执行 get_instance 函数(函数只有调用才会执行),直接返回get_instance函数名。

此时可以看作Student = get_instance,创建实例时相当于student = get_instance(jiang, 25),调用get_instance 函数,先判断实例是否在字典中,如果在直接从字典中获取并返回,如果不在执行 instances [cls] = Student(jiang, 25),然后返回该实例对象并赋值非student变量,即student = instances[cls]。

转载于:https://www.cnblogs.com/jiangxinyang/p/8454418.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值