1. __ new __
class Borg(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
ob = super(Borg, cls)
cls._instance = ob.__new__(cls, *args, **kwargs)
return cls._instance
class MyClass(Borg):
def __init__(self):
self.a = 1
if __name__ == '__main__':
a1 = MyClass()
a2 = MyClass()
a1.a = 10
print(a1.a)
print(a2.a)
print(a1.__dict__)
- 執(zhí)行結(jié)果
10
10
{'a': 10}
2. 共享屬性
class Borg(object):
_state = {}
def __new__(cls, *args, **kwargs):
ob = super(Borg, cls).__new__(cls, *args, **kwargs)
ob.__dict__ = cls._state
return ob
class MyClass(Borg):
def __init__(self):
self.a = 1
if __name__ == '__main__':
a1 = MyClass()
a2 = MyClass()
a1.a = 10
print(a1.a)
print(a2.a)
print(a1.__dict__)
- 執(zhí)行結(jié)果
10
10
{'a': 10}
3. 裝飾器
# 使用裝飾器實(shí)現(xiàn)單例模式
def singleton(cls, *args, **kwargs):
# 定義了一個(gè)私有的列表屬性俺亮,來(lái)判斷實(shí)例對(duì)象的是否存在肴颊,用于實(shí)例對(duì)象的創(chuàng)建
instance = {}
def _instance():
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return _instance
@singleton
class Test_singleton(object):
def __init__(self):
self.num = 0
def add(self):
self.num = 99
ts1 = Test_singleton()
ts2 = Test_singleton()
print(ts1)
print(ts2)
"""
可以使用類驾荣,實(shí)現(xiàn)裝飾器的創(chuàng)建__call__方法
"""
- 執(zhí)行結(jié)果
<main.Test_singleton object at 0x104103668>
<main.Test_singleton object at 0x104103668>
4. import方法
# mysingleton .py
class MyClass(object):
def __init__(self):
self.a = 1
s_myclass = MyClass()
# to use
from mysingleton import s_myclass
s_myclass.a