Image
python面試題之單例模式
?單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例類的特殊類钉跷。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問弥鹦,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個類的對象只能存在一個尘应,單例模式是最好的解決方案惶凝。
__new__()
在__init__()
之前被調(diào)用吼虎,用于生成實例對象犬钢。利用這個方法和類的屬性的特點可以實現(xiàn)設(shè)計模式的單例模式。單例模式是指創(chuàng)建唯一對象思灰,單例模式設(shè)計的類只能實例 這個絕對崇栌蹋考啊.絕對要記住1~2個方法,當(dāng)時面試官是讓手寫的.
1、 使用new方法
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/4/20 13:27
# @Author : 一葉知秋
# @File : test7.py
# @Software: PyCharm
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
if __name__ == '__main__':
a = MyClass()
b = MyClass()
print('a:', id(a))
print('b:', id(b))
print(a is b)
運行結(jié)果:
a: 1995200289352
b: 1995200289352
True
2洒疚、 裝飾器版本
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/4/20 13:27
# @Author : 一葉知秋
# @File : test7.py
# @Software: PyCharm
# 使用類裝飾器實現(xiàn)單例
class Singleton(object):
def __init__(self, cls):
self._cls = cls
self._instance = {}
def __call__(self, *args, **kwargs):
if self._cls not in self._instance:
self._instance[self._cls] = self._cls(*args, **kwargs)
return self._instance[self._cls]
# 使用函數(shù)裝飾器實現(xiàn)單例
def singleton(cls):
instances = {}
def get_instance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return get_instance
@Singleton
class MyClass:
a = 1
if __name__ == '__main__':
a = MyClass()
b = MyClass()
print('a:', id(a))
print('b:', id(b))
print(a is b)
運行結(jié)果:
a: 3077134387656
b: 3077134387656
True
希望對大家面試有幫助歹颓!