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

十个经典 Python 设计模式解析

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

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

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

1. 工厂模式(Factory Pattern)

想象一下,你有个大冰箱,每次需要冰淇淋时,你都不用直接打开冷冻室,而是通过一个工厂方法来决定要哪种口味。QcV28资讯网——每日最新资讯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)

好比给房间添加装饰,改变外观但不改变核心功能。比如,给打印语句加上颜色:QcV28资讯网——每日最新资讯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)

确保一个类只有一个实例,并提供全局访问点。就像一个班级只有一个班长:QcV28资讯网——每日最新资讯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)

当数据变化时,所有依赖它的对象都会得到通知。就像天气预报,一旦有新的天气数据,所有订阅者都会收到更新:QcV28资讯网——每日最新资讯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)

在不同情况下使用不同的算法,而无需修改使用算法的代码。就像烹饪,根据食材选择不同的烹饪方式:QcV28资讯网——每日最新资讯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)

让不兼容的对象协同工作,就像老式电视和现代播放器之间的连接器:QcV28资讯网——每日最新资讯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)

为对象提供一个替身,对原对象进行控制或包装。想象一个网站缓存:QcV28资讯网——每日最新资讯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)

遍历集合而不需要暴露其内部结构。就像翻阅书页:QcV28资讯网——每日最新资讯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)

将请求封装为对象,使你能够推迟或更改请求的执行。就像点餐系统:QcV28资讯网——每日最新资讯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)

通过共享对象来节约内存,减少重复。像打印海报,每个字母可以共享:QcV28资讯网——每日最新资讯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设计模式,掌握了它们,你的代码将会更有组织,更易于理解和维护。记住,编程不只是写代码,更是艺术创作!现在就去把这些模式运用到你的项目中,让它们大放异彩吧!QcV28资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
  • 电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会为了更好地让参展观众真正感受到智能家居的绝妙之处,海尔智家的程传岭先生同样介绍了展会上海尔智家的模拟500平大平层,还原生活空间沉浸式体验。程传
Top