• python---设计模式


    python中设计模式-单例模式

    基于__new__方法实现

    第一个设计:
    1. class MySingleton:
    2. def __init__(self):
    3. pass
    4. def __new__(cls, *args, **kwargs):
    5. pass
    6. mysingleton1 = MySingleton()
    7. mysingleton2 = MySingleton()
    8. print(mysingleton1)
    9. print(mysingleton2)
    10. print(id(mysingleton1))
    11. print(id(mysingleton2))
    12. print(mysingleton1 == mysingleton2)

    输出结果:

    None

    None

    1601545424

    1601545424

    True

    此时连个对象是同一个对象,但是都是None,也就是没有进行实例化,失败。

    第二个设计:
    1. class MySingleton:
    2. def __init__(self):
    3. pass
    4. def __new__(cls, *args, **kwargs):
    5. # 创建对象,并返回
    6. return super(MySingleton, cls).__new__(cls)
    7. mysingleton1 = MySingleton()
    8. mysingleton2 = MySingleton()
    9. print(mysingleton1)
    10. print(mysingleton2)
    11. print(id(mysingleton1))
    12. print(id(mysingleton2))
    13. print(mysingleton1 == mysingleton2)

    输出结果:

    <__main__.MySingleton object at 0x0000024BEB827A20>

    <__main__.MySingleton object at 0x0000024BEB827AC8>

    2525096999456

    2525096999624

    False

    创建了对象,但是却创建了两次,失败。

    第三个设计:
    1. class MySingleton:
    2. __instance = None
    3. def __init__(self, name, age):
    4. self.name = name
    5. self.age = age
    6. print("调用了__init方法__")
    7. def __new__(cls, *args, **kwargs):
    8. # 如果类属性__instance不为None,则直接返回它的值
    9. if cls.__instance:
    10. return cls.__instance
    11. # 如果类属性__instance是None
    12. # 创建对象,并返回
    13. cls.__instance = super(MySingleton, cls).__new__(cls)
    14. return cls.__instance
    15. mysingleton1 = MySingleton(name='zhangsan', age=25)
    16. mysingleton2 = MySingleton(name='lisi', age=35)
    17. print(mysingleton1)
    18. print(mysingleton2)
    19. print(id(mysingleton1))
    20. print(id(mysingleton2))
    21. print(mysingleton1 == mysingleton2)
    22. # mysingleton1的值被覆盖掉了,因为__init__方法调用了两次
    23. print(mysingleton1.name, str(mysingleton1.age))
    24. print(mysingleton2.name, str(mysingleton2.age))

    输出结果:

    调用了__init方法__

    调用了__init方法__

    <__main__.MySingleton object at 0x000001F49B877400>

    <__main__.MySingleton object at 0x000001F49B877400>

    2150092993536

    2150092993536

    True

    lisi 35

    lisi 35

    是同一个对象,但是第二次赋值'lisi'覆盖了'zhangsan'的赋值,失败。

    第四个设计:
    1. class MySingleton:
    2. __instance = None
    3. def __init__(self, name, age):
    4. # 如果对象没有'name‘属性,就赋值,否则不赋值
    5. if not hasattr(self, 'name'):
    6. self.name = name
    7. self.age = age
    8. print("调用了__init方法__")
    9. def __new__(cls, *args, **kwargs):
    10. # 如果类属性__instance不为None,则直接返回它的值
    11. if cls.__instance:
    12. return cls.__instance
    13. # 如果类属性__instance是None
    14. # 创建对象,并返回
    15. cls.__instance = super(MySingleton, cls).__new__(cls)
    16. return cls.__instance
    17. mysingleton1 = MySingleton(name='zhangsan', age=25)
    18. mysingleton2 = MySingleton(name='lisi', age=35)
    19. print(mysingleton1)
    20. print(mysingleton2)
    21. print(id(mysingleton1))
    22. print(id(mysingleton2))
    23. print(mysingleton1 == mysingleton2)
    24. # mysingleton1的值被覆盖掉了,因为__init__方法调用了两次
    25. print(mysingleton1.name, str(mysingleton1.age))
    26. print(mysingleton2.name, str(mysingleton2.age))

    输出结果:

    调用了__init方法__

    调用了__init方法__

    <__main__.MySingleton object at 0x000002B02C8A7A20>

    <__main__.MySingleton object at 0x000002B02C8A7A20>

    2955684772384

    2955684772384

    True

    zhangsan 25

    zhangsan 25

    同一个对象,值也没有发生覆盖,算是成功。

    但是如果多线程情况呢?

    第五个设计(了解):
    1. import threading
    2. class MySingleton:
    3. __instance = None
    4. __instence_lock = threading.Lock()
    5. def __init__(self, name, age):
    6. # 如果对象没有'name‘属性,就赋值,否则不赋值
    7. if not hasattr(self, 'name'):
    8. self.name = name
    9. self.age = age
    10. print("调用了__init方法__")
    11. def __new__(cls, *args, **kwargs):
    12. # 如果类属性__instance为None
    13. if not cls.__instance:
    14. # 代码块加锁,线程排队后再次判断是否为None
    15. with MySingleton.__instence_lock:
    16. if not cls.__instance:
    17. # 如果类属性__instance是None,创建对象
    18. cls.__instance = object.__new__(cls)
    19. return cls.__instance
    20. def __str__(self):
    21. # 类似java的toString
    22. return str(id(self)) + " [name] = " + self.name + " [age] = " + str(self.age)
    23. # 类似java的Thread中的run方法
    24. def task(name, age):
    25. obj = MySingleton(name=name, age=age)
    26. print(obj)
    27. for i in range(50):
    28. thread = threading.Thread(target=task, args=['name' + str(i), 30 + i])
    29. thread.start()

    python中设计模式-工厂模式

    简单工厂模式

    1. class Car(object):
    2. def run(self):
    3. print("__轿车__在跑")
    4. class Benz(Car):
    5. def run(self):
    6. print("[奔驰]在跑")
    7. class Bmw(Car):
    8. def run(self):
    9. print("[宝马]在跑")
    10. class Audi(Car):
    11. def run(self):
    12. print("[奥迪]在跑")
    13. class User(object):
    14. def __init__(self, name):
    15. self.name = name
    16. def drive(self, car):
    17. print(self.name, "驾驶", end='')
    18. car.run()
    19. user = User('张三')
    20. user.drive(Audi())
    21. user.drive(Bmw())
    22. user.drive(Benz())
    23. class Factory(object):
    24. @staticmethod
    25. def get_tool(toolname):
    26. if 'benz' == toolname:
    27. return Benz()
    28. elif 'bmw' == toolname:
    29. return Bmw()
    30. elif 'audi' == toolname:
    31. return Audi()
    32. else:
    33. return Car()
    34. print()
    35. user.drive(Factory.get_tool('audi'))
    36. user.drive(Factory.get_tool('bmw'))
    37. user.drive(Factory.get_tool('benz'))
    38. user.drive(Factory.get_tool('hello'))

  • 相关阅读:
    车道线算法合集——各个车道线论文代码地址、算法总结、优劣分析
    torch.clamp
    elasticsearch高级篇:核心概念和实现原理
    stable diffusion打造自己专属的LORA模型
    DES算法子密钥的生成过程
    《Linux进程控制》
    Node.js:pnpm - 速度快、节省磁盘空间的软件包管理器
    蓝桥杯每日一题2023.10.25
    智能农业技术:物联网、无人机与机器人引领的绿色革命
    计算机网络
  • 原文地址:https://blog.csdn.net/yaya_jn/article/details/134303602