python实现单例模式方法_Python实现单例模式的5种方式
寫在前面
學(xué)究嘛,就記錄一下;
本質(zhì)都是通過(guò)設(shè)置一個(gè)標(biāo)志位來(lái)實(shí)現(xiàn), 通俗的講就是當(dāng)?shù)谝淮螌?shí)例化時(shí), 記錄下"已經(jīng)實(shí)例化了", 當(dāng)再次實(shí)例化時(shí), 將"記錄"的地址返回;
題外話, 函數(shù)它不香么? 還面向?qū)ο? 要什么對(duì)象.
1. 模塊(module)
這種方式不用干啥, 正常寫code就可以了, 一旦這個(gè)模塊被導(dǎo)入就會(huì)生成.pyc文件, 第二次導(dǎo)入時(shí)加載的就是.pyc
# girl.py
class GirlFriend:
pass
Lucy = GirlFriend()
# me.py
from girl import Lucy
2. 裝飾器實(shí)現(xiàn)
定義一個(gè)裝飾器如下
def singleton(cls):
instances = {}
@functools.wraps(cls)
def _wrapper(*args, **kw):
if cls not in instances:
print('沒(méi)有該實(shí)例,創(chuàng)建一個(gè)')
instances[cls] = cls(*args, **kw)
return instances[cls]
return _wrapper
使用裝飾器
@singleton
class GirlFriend:
pass
3. 類裝飾器使其
class Singleton:
def __init__(self, cls):
self._cls = cls
self._instance = {}
def __call__(self, *args):
if self._cls not in self._instance:
self._instance[self._cls] = self._cls(*args)
return self._instance[self._cls]
# 用法
@Singleton
class GirlFriend:
pass
4. __new__方法實(shí)現(xiàn)
class GirlFriend:
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
cls._instance = super().__new__(cls)
return cls._instance
# 用法
Lucy = GirlFriend()
5. 元類實(shí)現(xiàn)
class GirlFriend(type):
def __new__(cls, name, bases, attrs):
cls._instance = None
return type.__new__(cls, name, bases, attrs)
def __call__(cls, *args, **kw):
if cls._instance is None:
cls._instance = type.__call__(cls, *args, **kw)
return cls._instance
# 用法
class Lucy(metaclass=GirlFriend):
pass
總結(jié)
裝飾器實(shí)現(xiàn)比較簡(jiǎn)單, 也好理解
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python实现单例模式方法_Python实现单例模式的5种方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python简短语法_python 简单
- 下一篇: websocket python爬虫_p