单例模式

单例模式

定义:基于某种方法实例化多次得到实例是同一个

当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例

单例模式(类内部定义静态方法)

# settings.py
IP = '1.1.1.1'
PORT = 3306


class Mysql:
    __instacne = None

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

    @classmethod
    def from_conf(cls):
        if cls.__instacne is None:
            cls.__instacne = cls(IP, PORT)
        return cls.__instacne


obj1 = Mysql.from_conf()
obj2 = Mysql.from_conf()
obj3 = Mysql.from_conf()

print(obj1 is obj2 is obj3)
####
True


print(obj1.__dict__)
print(obj2.__dict__)
print(obj3.__dict__)
####
{'ip': '1.1.1.1', 'port': 3306}
{'ip': '1.1.1.1', 'port': 3306}
{'ip': '1.1.1.1', 'port': 3306}


obj4 = Mysql('10.10.10.11', 3307)
print(obj4.__dict__)
####
{'ip': '10.10.10.11', 'port': 3307}

单例模式(装饰器)

# settings.py
IP = '1.1.1.1'
PORT = 3306


def singleton(cls):
    cls.__instance = cls(IP, PORT)

    def wrapper(*args, **kwargs):
        if len(args) == 0 and len(kwargs) == 0:
            return cls.__instance
        return cls(*args, **kwargs)

    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()

print(obj1 is boj2 is obj3)
#####
True


print(obj1.__dict__)
print(obj2.__dict__)
print(obj3.__dict__)
#####
{'ip': '1.1.1.1', 'port': 3306}
{'ip': '1.1.1.1', 'port': 3306}
{'ip': '1.1.1.1', 'port': 3306}


obj4 = Mysql('1.1.1.4', 3308)
print(obj4.__dict__)
#{'ip': '1.1.1.4', 'port': 3308}

print(obj1 is obj2 is obj3)
###
True


print(obj1.__dict__)
print(obj2.__dict__)
print(obj3.__dict__)
#####
{'ip': '1.1.1.1', 'port': 3306}
{'ip': '1.1.1.1', 'port': 3306}
{'ip': '1.1.1.1', 'port': 3306}


obj4 = Mysql('1.1.1.4', 3308)
print(obj4.__dict__)
#####
{'ip': '1.1.1.4', 'port': 3308}
posted @ 2019-06-22 11:02  Firekeeper  阅读(111)  评论(0)    收藏  举报