python设计模式大全

Python设计模式大全

简介

Python 是一种高级、高性能、动态编程语言,因其简单易读和灵活性而受到广泛的欢迎。在 Python 中,设计模式是解决问题或问题系列的经验总结。对于初学者,学习设计模式对于提高代码的效率和准确性非常重要。在这里,我们将介绍 Python 的一些最流行的设计模式,这些设计模式对于 Python 程序员来说是必须要学习的。

设计模式分类

Python设计模式通常可以分为三类:

  1. 创建型设计模式: 处理对象的创建机制,封装了对象的创建过程,从而增强了对象的灵活性与可配置性。
  2. 行为型设计模式: 关注对象之间的通信和相互作用,以及在不同的对象间接收处理消息的方式。
  3. 结构型设计模式: 处理对象在应用内组合的方式,从而可以组合出更加复杂的结构。

创建型设计模式

工厂模式

工厂模式是一种创建对象的方法,这种方法将对象的创建委托给工厂类,而不是直接在代码中创建对象。这种方式可以隐藏对象的创建细节,从而简化了代码逻辑。

示例:

我们有一个动物园,里面有不同种类的鸟类。我们需要编写代码,例如:当我们调用这个 BirdFactory 的时候,它将对应的鸟类实例化并返回:

from abc import ABCMeta, abstractmethod
class Bird(metaclass=ABCMeta):
    """
    Abstract class of Bird
    """
    @abstractmethod
    def fly(self):
        pass
class Pigeon(Bird):
    """
    Class of Pigeon
    """
    def fly(self):
        print("Pigeon can fly")
class Sparrow(Bird):
    """
    Class of Sparrow
    """
    def fly(self):
        print("Sparrow can fly")
class BirdFactory:
    @staticmethod
    def create_bird(bird_type):
        """
        create bird method
        """
        if bird_type == 'Pigeon':
            return Pigeon()
        elif bird_type == 'Sparrow':
            return Sparrow()
        else:
            return None
bird_factory = BirdFactory()
pigeon = bird_factory.create_bird('Pigeon')
pigeon.fly()

运行上述代码将会输出: "Pigeon can fly"。

单例模式

单例模式保证了一个类只能有一个实例。这种方式非常适用于管理资源,例如线程池、数据库连接等。单例模式可以保证程序中只有一个实例,从而提高了资源的利用效率。

示例:

我们有一个日志类,我们确信在代码中只要有一个日志对象即可。

class Logger:
    __instance = None
    def __init__(self):
        if Logger.__instance != None:
            raise Exception("You cannot create more than one instance")
        else:
            Logger.__instance = self
    @staticmethod 
    def get_instance():
        if Logger.__instance == None:
            Logger()
        return Logger.__instance
logger1 = Logger.get_instance()
logger2 = Logger.get_instance()
print(logger1)
print(logger2)

运行上述代码将会输出相同的内存地址。

行为型设计模式

观察者模式

观察者模式是一种常用的行为模式。在这种模式中,当一个对象的状态发生变化时,依赖它的所有对象都将自动得到通知。观察者模式下,一个被观察的主题被观察者观察,当主题变化时,观察者将会收到通知并做出相应的更新。这种模式可以降低主题和观察者之间的耦合度。

示例:

我们有一组股票,需要在股票价格变化时通知其它的观察者。

from abc import ABCMeta, abstractmethod
class Subject(object):
    def __init__(self):
        self.observers = []
    def attach(self, observer):
        self.observers.append(observer)
    def detach(self, observer):
        self.observers.remove(observer)
    def notify(self, **kwargs):
        for observer in self.observers:
            observer.update(**kwargs)
class Stock(Subject):
    def __init__(self):
        super().__init__()
        self._name = None
        self._price = None
    def set_price(self, name, price):
        self._name = name
        self._price = price
        self.notify(name=name, price=price)
class Observer(metaclass=ABCMeta):
    @abstractmethod
    def update(self, **kwargs):
        pass 
class InvestorA(Observer):
    def __init__(self, name):
        self._name = name
    def update(self, **kwargs):
        print('Investor A: %s price is %s' %
              (kwargs['name'], kwargs['price']))
class InvestorB(Observer):
    def __init__(self, name):
        self._name = name
    def update(self, **kwargs):
        print('Investor B: %s price is %s' %
              (kwargs['name'], kwargs['price']))
stock = Stock()
investora = InvestorA('InvestorA')
investorb = InvestorB('InvestorB')
stock.attach(investora)
stock.attach(investorb)
stock.set_price('GOOG', 200)
stock.set_price('AAPL', 250)

运行上述代码将会输出:Investor A: GOOG price is 200、Investor B: GOOG price is 200、Investor A: AAPL price is 250、Investor B: AAPL price is 250。

结构型设计模式

代理模式

代理模式是一种常用的设计模式,它可以为其他对象提供一种代理以控制对这个对象的访问。代理类负责客户端请求,同时隐藏被代理对象的实现细节。

示例:

我们有一个爬虫类(Spider),因为安全问题,我们不能让所有用户都可以直接访问该类。因此我们创建一个代理类(ProxySpider),只有使用许可的用户才可以访问 Spider 类。

class ISpider(metaclass=ABCMeta):
    @abstractmethod
    def crawl(self):
        pass 
class Spider(ISpider):
    def __init__(self):
        pass 
    def crawl(self):
        print('Spider is crawling')
class ProxySpider(ISpider):
    def __init__(self):
        self.spider = Spider()
    def crawl(self):
        secret = [0, 1, 2]
        if int(str(time.time()).split('.')[0][-1]) in secret:
            self.spider.crawl()
        else:
            print('您无权访问该资源')
p = ProxySpider()
p.crawl()

print('您无权访问该资源') 出现时,表示访问被限制;否则,输出 Spider is crawling

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python设计模式大全 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • Python实现简单的语音识别系统

    Python实现简单的语音识别系统——完整攻略 1. 简介 随着人工智能的发展,语音识别系统的应用越来越广泛。为此,本文将介绍如何用Python实现简单的语音识别系统。 在本文中,我们将使用以下库来实现我们的语音识别系统: pyaudio:录制音频 speech_recognition:转换音频文本 pyttsx3:将文本转换为语音输出 2. 安装 首先,我…

    python 2023年5月19日
    00
  • Python的logging模块基本用法

    下面是详细讲解“Python的logging模块基本用法”的完整攻略。 简介 Python的logging模块是Python内置的一个标准库,它提供了一种非常灵活的记录日志信息的方式。使用logging模块可以将对程序的控制台输出、文件输出、邮箱输出进行统一管理,可有效地在开发、测试、部署、运维多个环节中使用,记录各种信息,比如错误信息、调试信息、运行信息等…

    python 2023年6月5日
    00
  • Python scrapy爬取小说代码案例详解

    Python scrapy爬取小说代码案例详解 本文将详细介绍使用Python的scrapy框架实现小说网站爬取的过程。使用Python进行网络爬虫开发,scrapy框架是一个强大的工具。 安装scrapy 使用pip安装scrapy视频,命令如下: pip install scrapy 创建scrapy项目 使用命令行创建项目: scrapy startp…

    python 2023年5月14日
    00
  • python 图像增强算法实现详解

    Python图像增强算法实现详解 图像增强是一种常用的图像处理技术,它可以改善图像的质量和视觉效果。在本文中,我们将介绍如何使用Python实现图像增强算法。我们将分为以下几个步骤: 载入图像 灰度化处理 直方图均衡化 高斯滤波 边缘检测 示例说明 步骤1:载入图像 在实现图像增强算法之前,需要载入图像。在这个例子中,我们将使用Pillow库中的Image类…

    python 2023年5月14日
    00
  • 这个python代码的正确javascript代码表达式是什么

    【问题标题】:What would be a proper javascript code expression to this python code这个python代码的正确javascript代码表达式是什么 【发布时间】:2023-04-04 06:15:01 【问题描述】: 如何将此代码转换为 javascript?我尝试了不同的编译器,但没有一个…

    Python开发 2023年4月6日
    00
  • Python中常用数据类型使用示例概括总结

    以下是“Python中常用数据类型使用示例概括总结”的完整攻略。 1. Python中常用的数据类型 在Python中常用的数据类型包括整数、浮点数、字符串、列表、元组、字典和集合等。以下是这些数据类型的简要介绍: 整数:表示整数,例如1、2、3等。 浮点数:表示带有小数点的数,例如1.0、2.5、3.14等。 字符串:表示文本,例如”hello””worl…

    python 2023年5月13日
    00
  • python爬虫基础之简易网页搜集器

    下面我来详细讲解一下“python爬虫基础之简易网页搜集器”的完整攻略。 简介 爬虫是指程序按照一定规则自动浏览互联网,并从中获取所需信息的一种技术。Python是一种广泛使用的编程语言,也是开发爬虫的常用语言之一。本文主要介绍如何用Python编写一个简易的网页搜集器。 爬虫基本原理 爬虫的基本原理是通过向指定的URL发送HTTP请求,获取到对应的HTML…

    python 2023年5月14日
    00
  • Python3字符串的常用操作方法之修改方法与大小写字母转化

    下面是针对Python3字符串的常用操作方法之修改方法与大小写字母转化的完整攻略: 修改字符串 在Python中,字符串是不可变的,所以不能直接修改字符串,但可以通过以下方式对字符串进行修改操作: 1. 字符串拼接 通过”+”操作符可以对多个字符串进行拼接,生成一个新的字符串。示例代码如下: str1 = "Hello" str2 = &…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部