首页 > 编程语言 >面向机器学习工程师的 Python 设计模式:Observer

面向机器学习工程师的 Python 设计模式:Observer

时间:2022-09-26 14:13:02浏览次数:76  
标签:Instagram Observer Python 观察者 VIP 设计模式 罗纳尔多

Photo by 杰森梁 on 不飞溅

面向机器学习工程师的 Python 设计模式:Observer

了解如何通过采用设计模式来构建代码:基于 Instagram 的示例

介绍

模式描述了一个经常出现的问题并提出
在类/对象组织方面可能的解决方案
一般认为可以有效地解决问题本身。
设计模式具有四个主要元素:

  • 姓名: 助记符参考,使我们能够用一两个词识别问题和解决方案。
  • 问题: 模式旨在提供解决方案的问题和上下文的描述。
  • 解决方案: 描述了构成
    解决方案以及它们之间的关系。
  • 结果: 指定应用所提议的解决方案可能带来的后果。

有几类设计模式,但已经确定了两个主要标准:

模式指的是什么:

  • 对象 : 可以改变的对象之间的关系
    执行。
  • 课程 :关注类和子类之间的关系。

模式的作用(目的):

  • 创造的 : 涉及创建对象的过程。
  • 结构 : 涉及类和对象的组成。
  • 行为的 : 定义类和对象如何交互和
    在他们之间分配责任。

但是存在多少设计模式呢?在下图中,您将看到根据其范围和目的在表格中结构化的设计模式列表。在接下来的文章中,我们将介绍最常见的设计模式。

Design Patterns (Image by Author)

如何定义设计模式?

设计模式由一些描述和促进其使用的基本属性定义。这些属性是:

  • 结构 :通过UML的图形表示所涉及的类和
    他们的关系。 (1) 参与者 :参与模式的类,它们的关系和职责。 (2) 合作 :各个班级如何协作以实现目标。
  • 结果 :使用该模式的优缺点以及使用该模式可能产生的副作用。
  • 执行 : 实施的技术和建议
    还参考特定的编程语言。
  • 示例源代码 : 提供的代码片段
    实施指南。
  • 已知用途 :在现有系统中的使用示例。
  • 相关模式 :与其他模式的差异和最重要的关系。

观察者

在我看来,理解如何定义设计模式的最简单方法是通过展示一个示例,让我们从观察者设计模式开始!

假设你是一个足球迷,你最喜欢的球员是克里斯蒂亚诺·罗纳尔多。您非常热情,想要了解有关该玩家的每条新闻和更新,因此您决定在 Instagram 上关注他。
现在您关注克里斯蒂亚诺·罗纳尔多,每次他在 Instagram 上发布帖子或采取行动时,您都会收到通知,并且所有内容都会出现在您的提要中。
在这个模式中,我们有两个演员,你是 观察者 而克里斯蒂亚诺·罗纳尔多是 主题 .

但是你会很容易理解,这不可能是一对一的关系。 克里斯蒂亚诺·罗纳尔多 是 Instagram 上最受关注的帐户之一,迄今为止大约有 4.82亿关注者 .这会让你明白 一个主题可以有多个观察者 ,所有人都对他的更新感兴趣。所以 关系 必须是 一对多 类型。

Subject-Observer relationship (Image by Author)

类图

在向您展示如何在 Python 中实现这种设计模式之前,我先为您提供一张带有类图的图像,以便您了解类之间的关系以及需要应用的方法。

Class Diagram (Image by Author)

  • Observer 和 Subject 是接口
  • 所有需要数据的观察者都需要实现 Observer 接口。
  • notify() 方法定义了当主体提供其数据时要采取的行动。
  • 主题维护一个名为“observers”的观察集合,它是当前注册的观察者的列表。
  • registerObserver() 和 unregisterObserver() 分别是添加和删除观察者的方法。
  • 当数据改变并且需要为观察者提供新数据时调用 notifyObservers()。

让我们编码吧!

首先,我们创建抽象类 Observer 和 Subject。在 Python 中创建抽象类必须继承 ABC。
观察者将有一个 update() 抽象方法,一旦他关注的 VIP 帐户发布了新内容,该方法就会通知他。
而Subject,即拥有这么多粉丝的VIP,有3个抽象功能,一个是注册一个新用户,一个是删除他,另一个(最重要的)是通知他的所有粉丝他创建了一个新帖子.

现在我们创建 InstaVIP 类,即负责实例化我们的 VIP(例如 Cristiano Ronaldo)的类。
请注意,notifyObserver 滚动浏览保存在名为observers_collection 的列表中的所有VIP 关注者以通知他们。

现在我们开发Follower类,也就是我们的观察者类。每个观察者都由一个用户名定义。在这个类中,我们应该定义每当 VIP 发布内容时都会调用的 update() 方法。理想情况下,此方法将更新我们的 Instagram 提要,但在这种情况下,它只会简单打印 VIP 发布了新内容的事实。

现在我们主要创建两个 Instagram 帐户: @theRealAccount1 @account2官方 .然后我们实例化我们的 VIP Cristiano Ronaldo。
主题必须注册我们的关注,这发生在两个账户在罗纳尔多的 Instagram 账户中点击“关注”时。
现在 Ronaldo 将使用 newPost() 方法创建一个新帖子。

在C罗的新帖生成时,会调用两个账号的更新方法,实际上会打印:

 创建了新帖子  
 @theRealAccount1 的通知:罗纳尔多创建的新帖子 @account2Official 的通知:罗纳尔多创建的新帖子

最后的想法

设计模式描述了一个经常出现的问题并提出
就类/对象组织而言,一种可能的解决方案通常被认为可以有效地解决问题本身。在各种各样的应用程序中,我们发现了相同的问题,即需要在主题更改其数据时立即通知(例如,see 发布了某些内容),而正确应用这种设计模式可以使我们的生活更轻松!
在以后的文章中,我将讨论机器学习工程师需要了解的其他设计模式,以便能够编写干净的结构化代码。

结束

马塞洛·波利蒂

领英 , 推特 , 简历

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/39512/00482614

标签:Instagram,Observer,Python,观察者,VIP,设计模式,罗纳尔多
From: https://www.cnblogs.com/amboke/p/16730704.html

相关文章

  • python各个模块的作用
    一.OS模块:整理文件和目录os.popen()函数与cmd命令窗口之间建立一个双向通道,可以从cmd窗口和程序间相互读取信息  二。time 等待,获取时间为python的内置模块在Pyt......
  • Python 的 f 字符串的好处
    Python的f字符串的好处Photoby阿贝德·伊斯梅尔on不飞溅如果您是一名Python程序员,那么您可能已经熟悉格式化字符串的各种方法。从Python3.6开始,有一种新......
  • aardio + Python 可视化快速开发桌面程序,一键生成独立 EXE
    网络上大家分享的aardio+Python混合开发的文章很多,不得不说aardio与Python混合开发是真的简单!▶ 快速入门推荐几个快速上手教程:《aardio+Python开发桌面软......
  • python命令行解析
    getoptimportgetopt,sysopts,args=getopt.getopt(sys.argv[1:],'-o:-s:-u:-a:')-o:-s:-u:-a:表示使用这个参数必须要传递实参,如-o9;但是不使用这个参数就不用传......
  • 【设计模式】之责任链模式
    定义责任链模式(ChainofResponsibilityPattern)中,有一条由请求处理者对象组成的链条,每个对象(除最后一个对象外)都持有下一个对象的引用,请求发送者将请求发送给第一个对象,......
  • Python工具箱系列(七)
    上期描述了如何在ubuntu18.04下安装python3.8,本期将描述:·BIOS开启CPU的虚拟化支持·如何在windows10/11下安装wsl/wslg·如何在有wsl/wslg的情况下安装ubuntu18.04......
  • python选择题小游戏
    python选择题小游戏按照华夫人的需求,只有唐伯虎选的是C时,他选中的才是秋香。answer=input('请从ABCD中选择你要娶的姑娘:')print('你选择的是'+answer)`ifansw......
  • python学习(mooc北京理工大学课程)1-5章
    1.python基本语法元素1.1正式学习前的基础知识1.1.1计算机的概念计算机是根据指令操作数据的设备1)功能性对数据的操作,表现为数据计算、输入输出处理和结果存储等 2)......
  • python api gitlab迁移所有项目
    1、gitlab生成token(略)帐号后台生成toekn2、python拉取所有的gitlab项目**代码如下:vimget_git_all.py**importos,sysifsys.version_info<(3,0):im......
  • Centos7安装Python虚拟环境之virtualenv
    一、安装自己需要的python版本步骤略二、安装virtualenv模块并创建虚拟环境[root@localhost~]#/usr/local/python3.6.8/bin/pip3installvirtualenv[root@localh......