Python设计模式:你的代码真的足够优雅吗?

发布于:2024-10-24 编辑:匿名 来源:网络

说到代码优化,Python作为高级编程语言,应用范围广泛,功能强大。在软件开发中,设计模式是一种广泛采用的解决问题的方法,它提供了可以在特定情况下重用的可行解决方案。

在 Python 中,有许多设计模式可用于优化代码。两种常见的设计模式是单例模式和工厂模式。

单例模式 单例模式是一种只允许创建一个实例的设计模式。在Python中,可以使用类变量和类方法来实现单例模式。

通过将类变量设置为None,并在类方法中进行判断并实例化,可以保证只创建一个实例。这在您需要共享资源或限制实例数量的情况下非常有用。

例如,我们有一个记录器,我们希望在整个应用程序日志记录中只有一个它的实例。我们可以创建一个单例模块,如下所示: 代码语言:python 代码运行次数:2 Copy Cloud Studio code run # logger.pyclass Logger: def __init__(self): self.log = [] def add_log(self, message ): self.log.append(message) def print_log(self): 对于 self.log 中的消息: print(message)logger = Logger()logger.add_log("错误:出了问题。

")logger.add_log(" 信息:过程成功完成。")logger.print_log() 上面的代码实际上是一个简单的对象生成过程。

但是,如果独立生成为文件模块,那么就变成了简单的单例模式。完成。

在其他模块中,我们可以直接导入 logger 模块并使用其中的实例。这样做的好处是,由于该模块在整个应用程序中只加载一次,因此我们可以确保只有一个 Logger 实例存在。

这样提高了代码的可维护性和可读性,并且避免了多次实例化Logger的开销。double-check 在Java中,我们经常需要保证多线程环境下单例模式的正确性,这就涉及到多线程的处理。

具体来说,当多个线程尝试同时创建单例对象时,我们需要使用锁和双重检查机制来保证单例的唯一性和正确性。至于为什么需要双重检查机制,这里不再赘述。

现在,我们来看看相关的代码实现。代码语言:python 代码运行次数:0 Copy Cloud Studio code run import threadingclass Logger: _instance = None _lock = threading.Lock() def __new__(cls): if not cls._instance: with cls._lock: if not cls. _instance : cls._instance = super(Logger, cls).__new__(cls) cls._instance.log = [] return cls._instance def add_log(self, message): self.log.append(message) def print_log(self) :对于 self.log 中的消息: print(message)logger = Logger()logger.add_log("错误:出了问题。

")logger.add_log("信息:进程成功完成。")logger.print_log()上述是示例模式的单个具体实现。

在实际工作中,我们可以根据具体需求编写代码。通过使用单例模式,我们可以轻松地在整个应用程序中共享一个对象实例,从而避免重复创建对象的开销。

工厂模式 工厂模式是一种创建型设计模式,它提供了创建对象的通用接口。具体的对象创建逻辑由子类决定。

在Python中,我们可以使用工厂模式来实现动态对象创建,这样可以根据不同的情况返回不同的对象实例。这种灵活性使我们能够轻松地扩展和修改代码,同时提高其可维护性和可重用性。

简单工厂 在这个计算器类示例中,我们可以使用工厂模式根据不同的运算符创建不同类型的计算器对象。首先,我们可以创建一个抽象的计算器接口并定义计算方法。

然后,我们可以为每个算子创建一个具体的计算器类,实现计算器接口,并实现相应的计算逻辑。接下来,我们可以创建一个工厂类,它提供静态方法来根据不同的运算符参数实例化相应的特定计算器对象,并将其返回给调用者。

代码语言:python 代码运行次数:2 复制 Cloud Studio 代码运行 class Calculator: defcalculate(self, a, b): passclass AddCalculator(Calculator): defcalculate(self, a, b): return a + bclass SubtractCalculator (计算器):def计算(self,a,b):返回a - bclass CalculatorFactory:@staticmethod def create_calculator(operator):if运算符==“+”:返回AddCalculator()elif运算符==“-”:返回SubtractCalculator ()calculator = CalculatorFactory.create_calculator("+")result = Calculate.calculate(10, 5)print(result) 这种实现方式会导致代码重复,难以维护。为了优化这个工厂模式,我们可以使用字典来存储运算操作和对应的计算器类,而不是使用多个if-elif语句。

优化简单工厂代码 语言:python 代码运行次数:1 复制 Cloud Studio 代码运行类 Calculator: defcalculate(self, a, b): passclass AddCalculator(Calculator): defcalculate(self, a, b): return a + bclass SubtractCalculator(Calculator): defulate(self, a, b): return a - bclass CalculatorFactory: Calculators = { "+": AddCalculator, "-": SubtractCalculator } @staticmethod def create_calculator(operator): CalculatorFactory.calculators 中的 if 运算符: return CalculatorFactory.calculators[operator]() else: raise ValueError("Invalid operator")calculator = CalculatorFactory.create_calculator("+")result = Calculator.calculate(10, 5)print(result) 本例中的简单抽象工厂,我们首先创建一个名为 CalculatorFactory 的类。该类的主要功能是注册和创建计算器。

接下来,我们创建了两个具体的计算器类,分别命名为AddCalculator和SubtractCalculator,并将它们注册到CalculatorFactory中。这样我们就可以轻松地注册和创建各种不同的计算器类,而无需修改主工厂代码。

这样,当我们需要添加新的计算器时,只需要创建一个新的计算器类,并方便地在工厂中注册即可。这种灵活的设计使得系统具有高度的可扩展性,可以满足随时变化的需求。

代码语言:python 代码运行次数:0 复制 Cloud Studio 代码运行类 CalculatorFactory: def __init__(self): self.calculators = {} def register_calculator(self, operator, Calculator): self.calculators[operator] = Calculator def create_calculator (self,operator):if self.calculators中的运算符:返回self.calculators [operator]()else:引发ValueError(“无效运算符”)class AddCalculator:def计算(self,x,y):返回x + yclass SubtractCalculator : defcalculate(self, x, y): return x - y# 创建工厂实例factory = CalculatorFactory()# 注册计算器类factory.register_calculator("+", AddCalculator)factory.register_calculator("-", SubtractCalculator) # 使用工厂创建计算器 Calculator =factory.create_calculator("+")result = Calculate.calculate(2, 3)print(result) # 输出5 抽象工厂模式的优点是可以让代码更具可扩展性可维护,符合开闭原则。通过使用抽象工厂模式,我们可以将具体产品的创建过程与客户端代码分离,使得系统更加灵活和可扩展。

当需要添加新产品时,只需创建新的具体产品类和对应的具体工厂类,无需修改现有代码。使用这种设计模式可以有效降低系统的耦合性,提高代码的可维护性和可重用性。

因此,抽象工厂模式是一种非常有效的设计模式,特别适合需要频繁添加新产品的场景。复杂抽象工厂我们可以通过对所有方法进行抽取和抽象,进一步优化上述工厂的抽象。

代码语言:python 代码运行次数:0 复制 Cloud Studio 代码运行 from abc import ABC,abstractmethod# 抽象工厂类 class CalculatorFactory(ABC): @abstractmethod def create_calculator(self): pass# 具体工厂类 1 - 加法计算器工厂类AdditionCalculatorFactory(CalculatorFactory): def create_calculator(self): return AdditionCalculator()# 具体工厂类2 - 减法计算器工厂类 SubtractionCalculatorFactory(CalculatorFactory): def create_calculator(self): return SubtractionCalculator()# 计算器接口类 Calculator(ABC) : @ Abstractmethod defcalculate(self, num1, num2): pass# 特定计算器类 1 - 加法计算器类 AdditionCalculator(Calculator): defcalculate(self, num1, num2): return num1 + num2# 特定计算器类 2 - 减法计算器类 SubtractionCalculator (计算器): defcalculate(self, num1, num2): return num1 - num2# 使用抽象工厂模式创建计算器 def create_calculator(operator): if operator == "+":factory = AdditionCalculatorFactory( ) elif operator = =“-”:工厂=SubtractionCalculatorFactory() else: raise ValueError("无效的运算符") returnfactory.create_calculator()# 使用示例calculator = create_calculator("+")num1 = 1num2 = 2result =计算器.calculate(num1, num2)print("运算结果is :", result) 这个实现将创建计算器对象的逻辑封装在工厂类中,使得代码更加清晰,扩展性更强。如果需要添加新的运算符,只需要创建对应的具体工厂类和计算器类即可。

并在工厂类中做出相应的判断。总结 Python 设计模式为我们提供了解决问题的方法。

单例模式确保一个类只有一个实例并提供全局访问点;工厂模式提供了创建对象的接口,但具体的对象创建逻辑是由子类决定的。通过使用这些设计模式,我们可以更好地组织和管理代码,提高代码的可读性和可维护性。

Python设计模式:你的代码真的足够优雅吗?

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 2023年,新茶饮料走向全球

    2023年,新茶饮料走向全球

    的一年,已进入倒计时。 作为疫情发生后的消费元年,各大消费品牌企业这一年都经历了坎坷,在不确定性中走出了舒适区。 对内,企业转型,降本增效;对外,走出去,拓展版图。 。 从目前来看,这可能是一个不起眼的变化,但从长远来看,这可能是行业发生重大变化和公司新增长的

    06-18

  • 到田野里看了稻田,发现今天的农民比你想象的更有责任心

    到田野里看了稻田,发现今天的农民比你想象的更有责任心

    直播,这是屏幕上的创富运动。 舞蹈、带货、游戏、美妆……无数人通过直播加入了财富榜。 奖励和变现的数额越来越夸张,明星、主播和观众也越来越多。 直播,这是田间地头的一场希望之举。 种植水稻不采用传统的插秧方式,而是利用无人机将浸泡发芽的水稻种子直接播种到田里,

    06-21

  • 告别2019元年,2020年5G将迎来全面爆发

    告别2019元年,2020年5G将迎来全面爆发

    虽然上半年5G网络率先在部分国家实现商用,各大手机厂商纷纷还陆续推出了新款5G手机。 但从目前的情况来看,2020年只是5G爆发前的前奏; 2020年是5G的新篇章——这一说法也得到了国际数据公司IDC的肯定。 5G手机市场现状。 根据IDC 9月份的最新报告,全球智能手机市场将在下半

    06-18

  • 珠海中民国泰光伏基金成立 目标规模为100亿元人民币

    珠海中民国泰光伏基金成立 目标规模为100亿元人民币

    珠海洛钼国泰光伏基金成立,目标规模100亿元。 2019年5月19日消息,珠海洛钼国泰光伏基金于2018年设立,目标规模1亿元。 由深圳市洛钼资本管理有限公司管理,将用于投资城市天然气管道。   该基金由协鑫集团与深圳市中民资本管理有限公司共同设立,专注于天然气终端接收站、

    06-17

  • 东方精选送来巨额财富,高途能接受吗?

    东方精选送来巨额财富,高途能接受吗?

    “华夏启明之地,龙脉连天,这是万平方公里的点睛之笔。 一山有四时,十里外天气不同……”上《东方精选》的记述中,主播董宇辉身着西装,高呼朗诵赞美吉林的短文。 这与他这一年多来在直播中经常说的话没有什么不同。 但这一次,东方精选的小编不再平静。 他用自己的公众号在

    06-18

  • 印度对我国光伏背板反倾销案终裁披露

    印度对我国光伏背板反倾销案终裁披露

    印度对我国光伏背板反倾销案终裁揭晓。 2020年3月30日,印度工商部发布公告,对原产于或出口于中国的进口含氟背板发起反倾销立案调查。 检察官提供的名单涉及赛物、福斯特、中来、晶科、天合光能、晶澳太阳能等公司。 12个月后,2019年3月16日,印度调查机构发布了最终披露结

    06-08

  • 奥华内镜科创板IPO首轮被问及资金占用、商誉等连续37个问题

    奥华内镜科创板IPO首轮被问及资金占用、商誉等连续37个问题

    科创板IPO首轮问询中,上交所主要关注收购、实际控制人及股东及股权合规问题、核心技术来源、合作研发、共享专利、海外销售、原材料采购、寄售模式、客户、产业政策、环境保护以及行政处罚、资金占用、股份支付、销售费用、研发费用、申请催收、商誉等共37个问题。

    06-18

  • 中国有赞去年营收同比增长56%,付费商户增至97,158家

    中国有赞去年营收同比增长56%,付费商户增至97,158家

    香港上市公司中国有赞(3.HK)昨日公布全年业绩。

    06-18

  • 热晶生物一季度营收6.01亿元,同比增长千余倍

    热晶生物一季度营收6.01亿元,同比增长千余倍

    热晶生物今年一季度实现营收12.28亿元,同比增长0.15%;实现归属于上市公司股东的净利润6.01亿元,同比增长0.05%。

    06-18

  • 医疗IT创投Q1报告:谁是热门人选?

    医疗IT创投Q1报告:谁是热门人选?

    医疗旅游传播研究公司Mercom近日发布一季度医疗投资报告,显示医疗IT风险投资达14亿美元。 与去年第四季度的11亿美元相比,同比增长27%,环比增长74%。 最大的赢家:可穿戴设备、数据分析和远程医疗。 据mobihealthnews报道,Mercom、联合创始人和首席执行官Raj Prabhu表示,

    06-17

  • QQ的焦虑已被写入微信小程序

    QQ的焦虑已被写入微信小程序

    最近,QQ又上了热搜,这次是因为微信。 QQ为何推出微信小程序?近日,有网友发现腾讯QQ在微信平台上线了一款名为“腾讯QQ”的小程序。 从具体用途来看,授权后,用户可以通过该小程序登录自己的QQ号来接收消息。 QQ消息还可以用于账户切换和通知设置——整体功能非常有限,而

    06-18

  • 【课程预览】-疫情期间母基金投资的机遇与挑战

    【课程预览】-疫情期间母基金投资的机遇与挑战

    疫情即将过去,我们的工作和生活正在逐步回归正轨。 此次疫情期间,基金投资也面临重大机遇和挑战。 后疫情时代的机遇和挑战是什么,母基金应该做什么? 5月19日(周二)14:00-15:00,【学院课程】特邀基金管理公司合伙人廖俊霞宜信财富私募基金进行线上直播。 廖总将分享她多

    06-18