何为单列模式
不管实例化你创建多少的对象,我只给你们返回的总是哪一个
第一种:通过类方法实现
class mysql(object):
_instance = None
def __init__(self, ip, port):
self.ip = ip
self.port = port
@classmethod
def singleton(cls):
if not cls._instance:
cls._instance = mysql('127.0.0.1', 3306)
return cls._instance
if __name__ == '__main__':
obj1 = mysql.singleton()
obj2 = mysql.singleton()
print(obj1)
print(obj2)
第二种:通过装饰器实现
def singleton(cls):
_instance = cls('127.0.0.1', 3306)
def inner(*args, **kws):
if args or kws:
return cls(*args, **kws)
return _instance
return inner
@singleton
class Mysql(object):
def __init__(self, ip, port):
self.ip = ip
self.port = port
if __name__ == '__main__':
obj1 = Mysql()
obj2 = Mysql()
print(obj1)
print(obj2)
第三种:通过元类实现
class MymetaClass(type):
def __call__(self, *args, **kws):
if not hasattr(self, 'instance'):
self.instance = super().__call__(*args, **kws)
return self.instance
class Mysql(metaclass=MymetaClass):
def __init__(self, ip, port):
self.ip = ip
self.port = port
if __name__ == '__main__':
obj1 = Mysql('127.0.0.1', 3306)
obj2 = Mysql('127.0.0.1', 3308)
print(obj1)
print(obj2)
第四种:通过 __new__方法实现
class Singleton(object):
_instance = None
def __new__(cls, *args, **kws):
if not cls._instance:
cls._instance = super().__new__(cls, *args, **kws)
return cls._instance
class Mysql(Singleton):
def __init__(self):
self.ip = '127.0.0.1'
self.port = 3306
if __name__ == '__main__':
obj1 = Mysql()
obj2 = Mysql()
print(obj1)
print(obj2)
第五种:通过模块来实现
class Mysql(object):
def __init__(self, ip, port):
self.ip = ip
self.port = port
mysqlsingleton = Mysql('127.0.0.1', 2206)
from sing import mysqlsingleton