当前位置:首页 > 科技  > 软件

十个经典 Python 设计模式解析

来源: 责编: 时间:2024-05-30 17:16:27 127观看
导读大家好!今天咱们来聊聊Python编程中的那些“武林秘籍”——设计模式。它们就像编程界的暗号,让你的代码更加优雅、高效。让我们一起揭开这些模式的神秘面纱,看看它们在实际项目中的神奇作用吧!1. 工厂模式(Factory Pattern

大家好!今天咱们来聊聊Python编程中的那些“武林秘籍”——设计模式。它们就像编程界的暗号,让你的代码更加优雅、高效。让我们一起揭开这些模式的神秘面纱,看看它们在实际项目中的神奇作用吧!44r28资讯网——每日最新资讯28at.com

44r28资讯网——每日最新资讯28at.com

1. 工厂模式(Factory Pattern)

想象一下,你有个大冰箱,每次需要冰淇淋时,你都不用直接打开冷冻室,而是通过一个工厂方法来决定要哪种口味。44r28资讯网——每日最新资讯28at.com

def create_creamy_icecream(): return CreamyIceCream()def create_fruit_icecream(): return FruitIceCream()class IceCreamFactory:    @staticmethod    def get_icecream(kind):         if kind == 'creamy':            return create_creamy_icecream()        elif kind == 'fruit':            return create_fruit_icecream()

2. 装饰器模式(Decorator Pattern)

好比给房间添加装饰,改变外观但不改变核心功能。比如,给打印语句加上颜色:44r28资讯网——每日最新资讯28at.com

def color_decorator(func):    def wrapper(color):        print(f"{color} {func(color)}")    return wrapper@color_decoratordef say_hello(name): print(f"Hello, {name}")say_hello("Python")  # 输出: Red Hello, Python

3. 单例模式(Singleton Pattern)

确保一个类只有一个实例,并提供全局访问点。就像一个班级只有一个班长:44r28资讯网——每日最新资讯28at.com

class Singleton:    _instance = None    def __new__(cls):        if not cls._instance:            cls._instance = super().__new__(cls)        return cls._instanceclass MyClass(Singleton):    passobj1 = MyClass()obj2 = MyClass()  # obj1和obj2指向同一个实例

4. 观察者模式(Observer Pattern)

当数据变化时,所有依赖它的对象都会得到通知。就像天气预报,一旦有新的天气数据,所有订阅者都会收到更新:44r28资讯网——每日最新资讯28at.com

class Subject:    def attach(self, observer): self.observers.append(observer)    def detach(self, observer): self.observers.remove(observer)    def notify(self): for observer in self.observers: observer.update()class Observer:    def update(self, data): print(f"New data: {data}")subject = Subject()observer1 = Observer()subject.attach(observer1)subject.notify()  # 输出: New data: ...

5. 策略模式(Strategy Pattern)

在不同情况下使用不同的算法,而无需修改使用算法的代码。就像烹饪,根据食材选择不同的烹饪方式:44r28资讯网——每日最新资讯28at.com

class CookingStrategy:    def cook(self, ingredient): passclass BoilingStrategy(CookingStrategy):    def cook(self, ingredient): print(f"Heating {ingredient} to boil...")class GrillingStrategy(CookingStrategy):    def cook(self, ingredient): print(f"Grilling {ingredient}...")class Kitchen:    def __init__(self, strategy):        self.strategy = strategy    def cook(self, ingredient):        self.strategy.cook(ingredient)kitchen = Kitchen(BoilingStrategy())kitchen.cook("water")  # 输出: Heating water to boil...

6. 适配器模式(Adapter Pattern)

让不兼容的对象协同工作,就像老式电视和现代播放器之间的连接器:44r28资讯网——每日最新资讯28at.com

class OldTV:    def play(self, channel): print(f"Watching channel {channel}")class RemoteAdapter:    def __init__(self, tv):        self.tv = tv    def press_button(self, command): getattr(self.tv, command)()remote = RemoteAdapter(OldTV())remote.press_button("play")  # 输出: Watching channel ...

7. 代理模式(Proxy Pattern)

为对象提供一个替身,对原对象进行控制或包装。想象一个网站缓存:44r28资讯网——每日最新资讯28at.com

class RemoteImage:    def __init__(self, url):        self.url = url    def display(self):        print(f"Displaying image from {self.url}")class LocalImageProxy(RemoteImage):    def display(self):        print("Loading image from cache...")        super().display()

8. 迭代器模式(Iterator Pattern)

遍历集合而不需要暴露其内部结构。就像翻阅书页:44r28资讯网——每日最新资讯28at.com

class Book:    def __iter__(self):        self.page = 1        return self    def __next__(self):        if self.page > 10:            raise StopIteration        result = f"Page {self.page}"        self.page += 1        return resultbook = Book()for page in book: print(page)  # 输出: Page 1, Page 2, ..., Page 10

9. 命令模式(Command Pattern)

将请求封装为对象,使你能够推迟或更改请求的执行。就像点餐系统:44r28资讯网——每日最新资讯28at.com

class Command:    def execute(self): passclass Order(Command):    def execute(self, item): print(f"Preparing {item}...")class Kitchen:    def execute_order(self, cmd): cmd.execute()order = Order()kitchen = Kitchen()kitchen.execute_order(order)  # 输出: Preparing ...

10. 享元模式(Flyweight Pattern)

通过共享对象来节约内存,减少重复。像打印海报,每个字母可以共享:44r28资讯网——每日最新资讯28at.com

class Letter:    def __init__(self, text):        self.text = textclass FlyweightLetter(Letter):    _instances = {}    def __new__(cls, text):        if text not in cls._instances:            cls._instances[text] = super().__new__(cls, text)        return cls._instances[text]poster = "Python"print([l.text for l in poster])  # 输出: ['P', 'y', 't', 'h', 'o', 'n']

以上就是10个经典的Python设计模式,掌握了它们,你的代码将会更有组织,更易于理解和维护。记住,编程不只是写代码,更是艺术创作!现在就去把这些模式运用到你的项目中,让它们大放异彩吧!44r28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-91822-0.html十个经典 Python 设计模式解析

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 用于时间序列中的变点检测算法,你学会了吗?

下一篇: C# 中的 Action 和 Func 委托

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 服务存储设计模式:Cache-Aside模式

    服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 如何使用JavaScript创建一只图像放大镜?

    如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 三分钟白话RocketMQ系列—— 如何发送消息

    三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 每天一道面试题-CPU伪共享

    每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 网红炒股不为了赚钱,那就是耍流氓!

    网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就“胡锡进炒股是否知道认真报道”展开讨论。有
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • Meta盲目扩张致超万人被裁,重金押注元宇宙而前景未明

    Meta盲目扩张致超万人被裁,重金押注元宇宙而前景未明

    图片来源:图虫创意日前,Meta创始人兼CEO 马克·扎克伯发布公开信,宣布Meta计划裁员超11000人,占其员工总数13%。他公开承认了自己的预判失误:“不仅
Top