python 面向对象编程 之 单例模式

单例模式三种实现方式:


# settings.py
# Host='127.0.01'
# Port=8888

#方法一: 利用自定义元类来 控制对象的生成。
class Mymeta(type):
def __init__(self, class_name, class_base, class_dic):
'''
:param class_name: 类名
:param class_base: 基类
:param class_dic: 名称空间
'''
obj = self.__new__(self)
self.__init__(obj, settings.Host, settings.Port)
self.__instance = obj
super(Mymeta, self).__new__(class_name, class_name, class_dic)

def __call__(self, *args, **kwargs): # 对象后加括号触发 obj()
if not (args and kwargs):
return self.__instance

obj = self.__new__(self)
self.__init__(obj, *args, **kwargs)
return obj


class Mysql(metaclass=Mymeta):
def __init__(self, Host, Port):
self.Host = Host
self.Port = Port


# 方法二:利用类的绑定方法

class Mysql:
__instance = None

def __init__(self, Host, Port):
self.Host = Host
self.Port = Port

@classmethod
def single(cls, *args, **kwargs):
if not (args and kwargs):
if not cls.__instance:
cls.__instance = cls.__init__(settings.Host, settings.Port)
return cls.__instance

return cls.__init__(*args, **kwargs)


# 方法三:利用装饰器
def single(cls):
_instance = cls.__init__(settings.Host, settings.Port)

def wrapper(*args, **kwargs):
if not (args and kwargs):
return _instance
return cls.__init__(*args, **kwargs)

return wrapper


@single
class Mysql:
def __init__(self, Host, Port):
self.Host = Host
self.Port = Port

猜你喜欢

转载自www.cnblogs.com/yanxiatingyu/p/9264848.html