python设计模式大全

yizhihongxing

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使用rabbitmq实现网络爬虫示例

    Python使用RabbitMQ实现网络爬虫示例 RabbitMQ是一个消息中间件,使不同的应用程序之间可以相互发送和接收数据,这对于进行网络爬虫非常有用。下面是使用Python和RabbitMQ实现网络爬虫示例的完整攻略。 RabbitMQ和Python的安装 安装RabbitMQ RabbitMQ是用Erlang语言编写的,所以我们需要先安装Erlang…

    python 2023年5月20日
    00
  • python3 re返回形式总结

    以下是“Python3 re返回形式总结”的完整攻略: 一、问题描述 在Python中,re模块是用于正则表达式操作的标准库。在使用re模块时,我们需要了解re模块的返回形式,以便正确地使用它。本文将介绍Python3 re模块的返回形式。 二、解决方案 2.1 re.search()返回形式 re.search()方法用于在字符串中搜索匹配正则表达式的第一…

    python 2023年5月14日
    00
  • Python中的优先队列(priority queue)和堆(heap)

    Python中的优先队列(priority queue)和堆(heap) 优先队列(priority queue)是一种特殊的队列,其中元素被赋予优先级。当元素被插入到队列中时,具有较高优先级的元素会被先从队列中取出,而不考虑这些元素被插入到队列的顺序。在许多算法中,需要根据一定的条件对数据进行排序、筛选等操作,使用优先队列可以很好地解决这个问题。 在Pyt…

    python 2023年5月14日
    00
  • python中的list字符串元素排序

    以下是“Python中的list字符串元素排序”的完整攻略。 1. 使用sort()方法 sort()方法可以对列表进行排序,可以使用该方法对字符串元素进行排序例如下: my_list = [‘apple’, ‘banana’, ‘cherry’, ‘date’] my_list.sort() print(my_list) 在上面的示例代码中,我们首先定义了…

    python 2023年5月13日
    00
  • python实现百度关键词排名查询

    Python实现百度关键词排名查询攻略 在本攻略中,我们将介绍如何使用Python实现百度关键词排名查询,并提供两个示例。 步骤1:获取百度搜索结果页面的HTML代码 在使用Python实现百度关键词排名查询之前,我们需要获取百度搜索结果页面的HTML代码。我们可以使用Python的requests库获取百度搜索结果页面的HTML代码,并使用Python的B…

    python 2023年5月15日
    00
  • Python中常用数据类型使用示例概括总结

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

    python 2023年5月13日
    00
  • 基于wxPython的GUI实现输入对话框(1)

    “基于wxPython的GUI实现输入对话框(1)”是一篇关于用wxPython实现GUI输入对话框的教程。它的完整攻略可以分为以下几个步骤: 1. 安装wxPython wxPython是一个开源的Python库,可以用于创建GUI应用程序。你需要先安装wxPython库才能开始创建GUI输入对话框。你可以使用 pip 命令进行安装: pip instal…

    python 2023年5月18日
    00
  • 详解如何使用Python实现复制粘贴的功能

    下面我将为大家详细讲解如何使用Python实现复制粘贴的功能。 一、使用Python内置库实现复制粘贴 Python内置的pyperclip库提供了跨平台的剪贴板功能,可以方便地实现复制和粘贴的功能。 在使用前,需要使用pip或conda安装pyperclip库。 pip install pyperclip 然后,我们来看怎样使用它实现复制粘贴的功能。下面是…

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