当前位置: 首页 > news >正文

python---设计模式

python中设计模式-单例模式

基于__new__方法实现

第一个设计:
class MySingleton:def __init__(self):passdef __new__(cls, *args, **kwargs):passmysingleton1 = MySingleton()
mysingleton2 = MySingleton()
print(mysingleton1)
print(mysingleton2)
print(id(mysingleton1))
print(id(mysingleton2))
print(mysingleton1 == mysingleton2)

输出结果:

None

None

1601545424

1601545424

True

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

第二个设计:
class MySingleton:def __init__(self):passdef __new__(cls, *args, **kwargs):# 创建对象,并返回return super(MySingleton, cls).__new__(cls)mysingleton1 = MySingleton()
mysingleton2 = MySingleton()
print(mysingleton1)
print(mysingleton2)
print(id(mysingleton1))
print(id(mysingleton2))
print(mysingleton1 == mysingleton2)

输出结果:

<__main__.MySingleton object at 0x0000024BEB827A20>

<__main__.MySingleton object at 0x0000024BEB827AC8>

2525096999456

2525096999624

False

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

第三个设计:
class MySingleton:__instance = Nonedef __init__(self, name, age):self.name = nameself.age = ageprint("调用了__init方法__")def __new__(cls, *args, **kwargs):# 如果类属性__instance不为None,则直接返回它的值if cls.__instance:return cls.__instance# 如果类属性__instance是None# 创建对象,并返回cls.__instance = super(MySingleton, cls).__new__(cls)return cls.__instancemysingleton1 = MySingleton(name='zhangsan', age=25)
mysingleton2 = MySingleton(name='lisi', age=35)
print(mysingleton1)
print(mysingleton2)
print(id(mysingleton1))
print(id(mysingleton2))
print(mysingleton1 == mysingleton2)
# mysingleton1的值被覆盖掉了,因为__init__方法调用了两次
print(mysingleton1.name, str(mysingleton1.age))
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'的赋值,失败。

第四个设计:
class MySingleton:__instance = Nonedef __init__(self, name, age):# 如果对象没有'name‘属性,就赋值,否则不赋值if not hasattr(self, 'name'):self.name = nameself.age = ageprint("调用了__init方法__")def __new__(cls, *args, **kwargs):# 如果类属性__instance不为None,则直接返回它的值if cls.__instance:return cls.__instance# 如果类属性__instance是None# 创建对象,并返回cls.__instance = super(MySingleton, cls).__new__(cls)return cls.__instancemysingleton1 = MySingleton(name='zhangsan', age=25)
mysingleton2 = MySingleton(name='lisi', age=35)
print(mysingleton1)
print(mysingleton2)
print(id(mysingleton1))
print(id(mysingleton2))
print(mysingleton1 == mysingleton2)
# mysingleton1的值被覆盖掉了,因为__init__方法调用了两次
print(mysingleton1.name, str(mysingleton1.age))
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

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

但是如果多线程情况呢?

第五个设计(了解):
import threadingclass MySingleton:__instance = None__instence_lock = threading.Lock()def __init__(self, name, age):# 如果对象没有'name‘属性,就赋值,否则不赋值if not hasattr(self, 'name'):self.name = nameself.age = ageprint("调用了__init方法__")def __new__(cls, *args, **kwargs):# 如果类属性__instance为Noneif not cls.__instance:# 代码块加锁,线程排队后再次判断是否为Nonewith MySingleton.__instence_lock:if not cls.__instance:# 如果类属性__instance是None,创建对象cls.__instance = object.__new__(cls)return cls.__instancedef __str__(self):# 类似java的toStringreturn str(id(self)) + " [name] = " + self.name + " [age] = " + str(self.age)# 类似java的Thread中的run方法
def task(name, age):obj = MySingleton(name=name, age=age)print(obj)for i in range(50):thread = threading.Thread(target=task, args=['name' + str(i), 30 + i])thread.start()

python中设计模式-工厂模式

简单工厂模式:

class Car(object):def run(self):print("__轿车__在跑")class Benz(Car):def run(self):print("[奔驰]在跑")class Bmw(Car):def run(self):print("[宝马]在跑")class Audi(Car):def run(self):print("[奥迪]在跑")class User(object):def __init__(self, name):self.name = namedef drive(self, car):print(self.name, "驾驶", end='')car.run()user = User('张三')
user.drive(Audi())
user.drive(Bmw())
user.drive(Benz())class Factory(object):@staticmethoddef get_tool(toolname):if 'benz' == toolname:return Benz()elif 'bmw' == toolname:return Bmw()elif 'audi' == toolname:return Audi()else:return Car()print()user.drive(Factory.get_tool('audi'))
user.drive(Factory.get_tool('bmw'))
user.drive(Factory.get_tool('benz'))
user.drive(Factory.get_tool('hello'))

http://www.lryc.cn/news/226205.html

相关文章:

  • Java编写xml文件时,文件中特殊字符如何解决?
  • vue3 ts pinia openapi vue-query pnpm docker前端架构小记
  • ARM day4
  • 3.30每日一题(多元函数微分学)
  • 《OSTEP》条件变量(chap30)
  • MySQL的索引和复合索引
  • 关于mac下pycharm旧版本没删除的情况下新版本2023安装之后闪退
  • Django中如何让DRF的接口针对前后台返回不同的字段
  • 【机器学习】Kmeans聚类算法
  • getid3 获取视频时长
  • 如何知道一个程序为哪些信号注册了哪些信号处理函数?
  • 34 mysql limit 的实现
  • jbase实现申明式事务
  • 如何在在线Excel文档中规范单元格输入
  • 力扣138:随机链表的复制
  • C语言左移与右移学习
  • asp.net core mvc之 视图
  • ChatGLM3 tool_registry.py 代码解析
  • js实现定时刷新,并设置定时器上限
  • 常用Linux命令
  • 【C++】获取指定点所在屏幕的尺寸
  • 软文发布如何选择对应的媒体
  • Django如何创建表关系,Django的请求声明周期流程图
  • 微服务-我对Spring Clound的理解
  • 安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?
  • 机器学习——逻辑回归
  • 自动驾驶学习笔记(七)——感知融合
  • 【Java0基础学Java第八颗】 -- 继承与多态 -- 多态
  • 玩转ansible之参数调试和文件操作篇
  • JVM虚拟机:垃圾回收器之Parallel Old(老年代)