# 基于__new__的实现
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
s = Singleton()
print(s)
s1 = Singleton()
print(s1)
# 基于metaclass的实现
class MetaSingleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Logger(metaclass=MetaSingleton):
pass
log1 = Logger()
print(log1)
log2 = Logger()
print(log2)
# 说明:避免数据库连接的时候创建多个对象
import sqlite3
class MetaSingleton(type):
_instance = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instance:
cls._instance[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
return cls._instance[cls]
class Database(metaclass=MetaSingleton):
connection = None
def connect(self):
self.connection = sqlite3.connect('db.sqlite3')
self.cursor = self.connection.cursor()
return self.cursor
db1 = Database().connect()
print(db1)
db2 = Database().connect()
print(db2)
class Monostate(object):
__share_state = {}
def __new__(cls, *args, **kwargs):
obj = super(Monostate, cls).__new__(cls, *args, **kwargs)
obj.__dict__ = cls.__share_state
return obj
s = Monostate()
s.x = 1
s1 = Monostate()
# s的属性改变,s1的属性也会随之改变
print(s1.x)
# 模拟监听开关按下次数,控制灯光颜色的例子
class Observer:
"""观察者的基类"""
def update(self, observer):
"""观察者接收到通知需要触发的动作"""
pass
class Observable:
"""被观察者的基类"""
def __init__(self):
self.__observers = []
def add_observer(self, observer):
"""增加观察者"""
self.__observers.append(observer)
def remove_observer(self, observer):
"""移除观察者"""
self.__observers.remove(observer)
print('移除观察者:%s'%observer.__class__.__name__)
def notify_observer(self, object = 0):
"""状态改变时通知观察者"""
for observer in self.__observers:
observer.update(self)
class Switch(Observable):
"""开关"""
def __init__(self):
super(Switch,self).__init__()
self.__freq = 0
def get_freq(self):
"""获取开关按的次数"""
return self.__freq
def set_freq(self, freq):
"""设定开关次数"""
self.__freq = freq
print("开关次数:%s"%self.__freq)
self.notify_observer()
class White(Observer):
"""监听开关按一下为白色"""
def update(self, observable):
if observable.get_freq() == 1:
print("我是白色灯")
class Red(Observer):
"""监听开关按两下为红色"""
def update(self, observable):
if observable.get_freq() == 2:
print("我是红色灯")
def test_switch():
"""测试观察者模式"""
switch = Switch()
white_mode = White()
reg_mode = Red()
switch.add_observer(white_mode)
switch.add_observer(reg_mode)
switch.set_freq(1)
switch.set_freq(2)
switch.remove_observer(white_mode)
switch.remove_observer(reg_mode)
if __name__ == '__main__':
test_switch()
# 给安卓充电宝增加type-c转换线
class Battery(object):
"""
电池
"""
def __init__(self):
self.voltage = 0
self.electric = 0
def get_voltage(self):
return self.voltage
def get_electric(self):
return self.electric
class AndroidBattery(Battery):
"""
安卓充电宝
"""
def __init__(self):
self.voltage = 5
self.electric = 2
def get_line(self):
return "我是安卓线"
class TypeCAdapter(AndroidBattery, Battery):
"""
安卓充电线转type-c转换器
"""
def __init__(self):
self.voltage = 3
self.electric = 1
def get_line(self):
return "我是type-c线"
if __name__ == '__main__':
print("给小米手机充电")
xiaomi_charge = AndroidBattery()
print("充电线", xiaomi_charge.get_line())
print("电流", xiaomi_charge.get_electric())
print("电压", xiaomi_charge.get_voltage(), '\r\n')
print("给华为手机充电")
huawei_charge = TypeCAdapter()
print("充电线", huawei_charge.get_line())
print("电流", huawei_charge.get_electric())
print("电压", huawei_charge.get_voltage())
待更新……