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__)
输出:
10
10
{'a': 10}
2、共享属性
class Borg2(object):
_state = {}
def __new__(cls, *args, **kwargs):
ob = super(Borg2, cls).__new__(cls, *args, **kwargs)
ob.__dict__ = cls._state
return ob
class MyClass(Borg2):
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__)
输出:
10
10
{'a': 10}
3、装饰器
def singleton(cls, *args, **kwargs):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return getinstance
@singleton
class MyClass(object):
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__)
输出:
10
10
{'a': 10}
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