python之路---面向对象之单例模式

什么是单例模式

基于某种实现方式,实例化产生的多个对象是同一个(指向同一个内存地址)--->以节省内存

 实现方式一:通过类绑定方法

import setting


class MySql:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    @classmethod
    def get_conf(cls):
        if not hasattr(cls, '_%s__instance' % cls.__name__):
            cls.__instance = cls(setting.ip, setting.port)
        return cls.__instance


obj1 = MySql.get_conf()
obj2 = MySql.get_conf()
obj3 = MySql('127.0.0.1', 8080)
print(obj1)
print(obj2)
print(obj3)
# 通过类绑定方法,如果从配置文件加载IP与port,实例化产生的对象都是同一个

 实现方式二:通过装饰器

import setting


def singleton(cls):
    _instance = cls(setting.ip, setting.port)
    # 这句不能放到wrapper函数内,原因:在解释@语法的时候就已经完成了这步,之后调用MySql都只是在调用wrapper

    def wrapper(*args, **kwargs):
        if args or kwargs:
            obj = cls(*args, **kwargs)
            return obj
        return _instance

    return wrapper


@singleton
class MySql:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port


obj1 = MySql()
obj2 = MySql()
obj3 = MySql('10.1.1.1', 8080)
print(obj1)
print(obj2)
print(obj3)

实现方式三:通过元类

import setting


class MyType(type):
    def __init__(cls, class_name, class_bases, class_dic):
        super().__init__(class_name, class_bases, class_dic)
        cls.__instance = cls(setting.ip, setting.port)
        # cls.__instance = cls.__new__(cls)
        # cls.__init__(cls.__instance,setting.ip,setting.port)

    def __call__(cls, *args, **kwargs):
        if args or kwargs:
            obj = cls.__new__(cls)
            cls.__init__(obj, *args, **kwargs)
            return obj
        return cls.__instance


class MySql(object, metaclass=MyType):
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port


obj1 = MySql()
obj2 = MySql()
obj3 = MySql('10.1.1.1', 8080)
print(obj1)
print(obj2)
print(obj3)

实现方式四:根据导模块的特性

# 被导入的模块
import setting
class MySql:
    def __init__(self,ip,port):
        self.ip = ip
        self.port = port


instance_obj = MySql(setting.ip,setting.port)

#执行文件

from singleton import MySql, instance_obj


def f1():
    return MySql('10.1.1.1', 8080)


def f2():
    return instance_obj


obj1 = f1()
obj2 = f2()
obj3 = f2()
print(obj1)
print(obj2)
print(obj3)

猜你喜欢

转载自blog.csdn.net/ltfdsy/article/details/82146400