单例模式:
多次实例化的结果指向同一个实例
settings 文件内容:
- IP='1.1.1.1'
- PORT=3306
- ================================================================
单例模式实现方式一:
- import settings
- class MySQL:
- __instance=None
- def __init__(self, ip, port):
- self.ip = ip
- self.port = port
- @classmethod
- def from_conf(cls):
- if cls.__instance is None:
- cls.__instance=cls(settings.IP, settings.PORT)
- return cls.__instance
- obj1=MySQL.from_conf()
- obj2=MySQL.from_conf()
- obj3=MySQL.from_conf()
- obj4=MySQL('1.1.1.3',3302)
- print(obj1)
- print(obj2)
- print(obj3)
- print(obj4)
- ==========================================================================
单例模式实现方式二:
- import settings
- def singleton(cls):
- _instance=cls(settings.IP,settings.PORT)
- def wrapper(*args,**kwargs):
- if len(args) !=0 or len(kwargs) !=0:
- obj=cls(*args,**kwargs)
- return obj
- return _instance
- return wrapper
- @singleton #MySQL=singleton(MySQL) #MySQL=wrapper
- class MySQL:
- def __init__(self, ip, port):
- self.ip = ip
- self.port = port
- obj1=MySQL() #wrapper()
- obj2=MySQL() #wrapper()
- obj3=MySQL() #wrapper()
- obj4=MySQL('1.1.1.3',3302) #wrapper('1.1.1.3',3302)
- print(obj1)
- print(obj2)
- print(obj3)
- print(obj4)
- ==========================================================================
单例模式实现方式三:
- import settings
- class Mymeta(type):
- def __init__(self,class_name,class_bases,class_dic):
- #self=MySQL 这个类
- self.__instance=self(settings.IP,settings.PORT)
- def __call__(self, *args, **kwargs):
- # self=MySQL 这个类
- if len(args) != 0 or len(kwargs) != 0:
- obj=self.__new__(self)
- self.__init__(obj,*args, **kwargs)
- return obj
- else:
- return self.__instance
- class MySQL(metaclass=Mymeta): #MySQL=Mymeta(...)
- def __init__(self, ip, port):
- self.ip = ip
- self.port = port
- obj1=MySQL()
- obj2=MySQL()
- obj3=MySQL()
- obj4=MySQL('1.1.1.3',3302)
- print(obj1)
- print(obj2)
- print(obj3)
- print(obj4)
- ==========================================================================
单例模式实现方式四:
- def f1():
- from singleton import instance
- print(instance)
- def f2():
- from singleton import instance,My
- SQL
- print(instance)
- obj=MySQL('1.1.1.3',3302)
- print(obj)
- f1()
- f2()
singletod 文件内容:
- import settings
- class MySQL:
- print('run....')
- def __init__(self, ip, port):
- self.ip = ip
- self.port = port
- instance=MySQL(settings.IP,settings.PORT)
单例模式
来源: http://www.bubuko.com/infodetail-2753794.html