单例模式、pickle模块

单例模式实现的多种方式

简介:单例模式可以保证一个类仅有一个实例,并提供一个访问它的全局访问点。适用性于当类只能有一个实例而且客户可以从一个众所周知的访问点访问它,例如访问数据库、MQ等。
1通过使用类实现
class C1(object):
    __instance=None
    def __init__(self,name,age):
        self.name=name
        self.age=age
    @classmethod
    def singleton(cls):
        if not cls.__instance:
            cls.__instance=cls('jason',11)
        return cls.__instance
obj1=C1.singleton()
obj2=C1.singleton()
obj3=C1.singleton()
print(id(obj1),id(obj2),id(obj3))
obj4=C1('猴子',16)
obj5=C1('猪',12)
print(id(obj4),id(obj5))
基于__new__方法实现
ass Mumeta(type):
    def __init__(self,name,bases,dic):
        self.__instance=object.__new__(self)
        self.__init__(self.__instance,'jason',18)
        super().__init__(name,bases,dic)
    def __call__(self, *args, **kwargs):
        if args or kwargs:
            obj=object.__new__(self)
            self.__init__(obj,*args,**kwargs)
            return obj
        return self.__instance
class Mysql(metaclass=Mumeta):
    def __init__(self,name,age):
        self.name=name
        self.age=age
obj1=Mysql()
obj2=Mysql()
print(id(obj1),id(obj2))#2480571889264 2480571889264
obj3=Mysql('猪猪',12)
obj4=Mysql('丫丫',21)
print(id(obj4),id(obj3))#2480572568144 2480572567952
'''基于模块的单例模式:提前产生一个对象 之后导模块使用'''
def outer(cls):
    _instance=cls('jason',12)
    def inner(*args,**kwargs):
        if args or kwargs:
            obj=cls(*args,**kwargs)
            return obj
        return _instance
    return inner
@outer
class Mysql:
    def __init__(self,host,port):
        self.host=host
        self.port=port
obj1=Mysql()
obj2=Mysql()
obj3=Mysql()
print(obj1 is obj2 is obj3)#True
obj4=Mysql('1.2.3.4',123)
obj5=Mysql('4.3.2.1',321)
print(id(obj4),id(obj5))#2152130515104 2152130515200

pickle序列化模块

pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,
优势:能够序列化python中所有的类型
缺陷:只能够在python中使用 无法跨语言传输 
需求:产生一个对象并保存到文件中 取出来还是一个对象
"""
需求:产生一个对象并保存到文件中 取出来还是一个对象
"""
class C1:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def func1(self):
        print('from func1')

    def func2(self):
        print('from func2')

obj = C1('jason', 18)

# import json
# with open(r'a.txt','w',encoding='utf8') as f:
#     json.dump(obj, f)
# import pickle
# with open(r'a.txt', 'wb') as f:
#     pickle.dump(obj, f)
# with open(r'a.txt','rb') as f:
#     data = pickle.load(f)
# print(data)
# data.func1()
# data.func2()
# print(data.name)









posted @ 2022-11-09 15:35  冰柠檬檬  阅读(26)  评论(0)    收藏  举报