单例模式
且任容枯 Lv4

单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点

使用new方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance

class Myclass(Singleton):
def __init__(self, a):
self.a = a

a = Myclass(10)
b = Myclass(20)
print(a.a)
print(b.a)
print(id(a),id(b))
# 20
# 20
# 2472684130160 2472684130160

装饰器版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def singleton(cls, *args, **kw):
instances = {}

def getinstance():
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]

return getinstance


@singleton
class Myclass:
pass

a = Myclass()
b = Myclass()
print(a,b)
# <__main__.Myclass object at 0x000001FBBF007E20> <__main__.Myclass object at 0x000001FBBF007E20>

import方法

1
2
3
4
5
6
7
8
9
10
11
# mysingleton.py
class My_Singleton(object):
def foo(self):
pass

my_singleton = My_Singleton()

# to use
from mysingleton import my_singleton

my_singleton.foo()