利用元类实现单例模式
class SingletonType(type):
_lock = threading.Lock()
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
with SingletonType._lock:
if not hasattr(cls, '_instance'):
cls._instance = super().__call__(*args, **kwargs)
return cls._instance
class Person(metaclass=SingletonType):
country = 'China'
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('xiao ming', 11)
p2 = Person('xiao wang', 12)
print(id(p1))
print(id(p2))
执行结果
2500573968032
2500573968032
利用__new__实现单例模式
class Person:
_lock = threading.Lock()
def __init__(self, name, age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
with Person._lock:
if not hasattr(cls, '_instance'):
cls._instance = object.__new__(cls)
return cls._instance
p1 = Person('xiao ming', 11)
p2 = Person('xiao wang', 12)
print(id(p1))
print(id(p2))
执行结果
1915329610360
1915329610360
通过类名+instance实现
class Person:
_lock = threading.Lock()
_instance = None
@classmethod
def instance(cls, *args, **kwargs):
if cls._instance is None:
with Person._lock:
if cls._instance is None:
cls._instance = cls(*args, **kwargs)
return cls._instance
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person.instance('xiao ming', 11)
p2 = Person.instance('xiao wang', 12)
print(id(p1))
print(id(p2))
执行结果
2575101100664
2575101100664