手写python单例单例_python实现单例模式的三种方式及相关知识解释

python实现单例模式的三种方式及相关知识解释

模块模式

装饰器模式

父类重写new继承

单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singleton实现的四种方法都是python的重要特征,反过来也刚好是几种特征的最佳实现.(比如你平常开发中很难遇到几个需要写元类的地方)如果不能随手写出某种实现,说明你对于那种实现的概念还没有完全掌握.最近场通过写装饰器模式的singleton来复习装饰器概念.

1. module实现

#模块实现

from Singleton import instance

instance

#Singleton.py

class Singleton(object):

pass

instance = Singleton()

知识点关联

python导入模块时即将模块运行一遍,可定义__all__变量指定那些变量可以被外部引用

2. 装饰器实现

#decorator装饰器实现

def Singleton(cls):

#instance作为字典变量写在外部,可以保证该装饰器的重用性

_instances = {}

def getinstance(*arg,**kwarg):

if cls not in _instances:

_instances[cls] = cls(*arg,**kwarg)

return _instances[cls]

return getinstance

@Singleton

class A(object):

pass

a = A()

b = A()

print(id(a)) #2268820031976

print(id(b))  #2268820031976

1 a is b

2

3 True

4

5 A.__name__

6

7 'getinstance'

从学习过程来看,装饰器学习的要点在于理解at语法等于一次A = Singleton(A).装饰过后A.__name__查看可以发现已经变成getinstance,在装饰器的getinstance之前使用functool.wrap可以解决问题.

3. 父类继承实现

#父类重写__new__

class Singleton(object):

_instance = None

def __new__(cls,*arg,**kwarg):

if not cls._instance:

cls._instance = super(Singleton,cls).__new__(cls, *arg, **kwarg)

return cls._instance

class A(Singleton):

pass

通过这个例子可以了解到父类都可以做些什么,无非是提前定义变量和函数.通过重写__new__函数,改变了A类别创建实例的过程.

推广开来的话,基本上本文的四个例子都是在”改变创建实例的过程”.包括JAVA中实现单例的几种方法也是同个道理.记住了这一点,知识便有了线索,就算下次忘了细节,也能沿着线索重新回忆所学过的内容.

将程序设计的思想应用到学习过程中,从例子中抽象得出原理,可以提高学习效率.

标签:__,Singleton,python,instance,三种,单例,装饰,cls

来源: https://www.cnblogs.com/daijingkun/p/10752669.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值