tiantianse一本道

Python 工匠:写好面向对象代码的原则

日本一本道a不卡免费

Python是一种支持多种编程风格的语言。面对相同的需求,具有不同背景的程序员可能会编写不同风格的Python代码。例如,一个习惯于编写C语言的程序员通常会定义很多函数来完成所有工作。这就是“程序编程”的概念。具有Java背景的程序员更倾向于设计许多相互关联的类,即“面向对象的编程(以下称为OOP)”。

虽然不同的编程风格各有特色,但不能直接比较。但OOP思维在现代软件开发中的重要作用应该是不容置疑的。

许多人在学习如何编写OOP代码时选择从23种经典的“设计模式”开始。但对于Python程序员来说,我不认为这是最好的选择。

Python对OOP的支持

Python学习交流组:1004391443

虽然Python语言具有核心OOP功能,如类,继承,多态等,但与完全基于OOP思想设计的编程语言(如Java)相比,它在OOP支持方面做了大量简化。例如,它没有严格的类私有成员,没有接口对象,等等。

同时,Python灵活的函数对象,duck类型和许多其他动态特性使得在其他语言中很难做到很难做到的事情。这些语言之间的差异导致了一个结果:许多经典的设计模式已经失去了Python的“品味”,并且可用性大大降低。

采取每个人都最熟悉的单身人士模型。您可以花费大量时间学习如何在Python中使用__new__方法或元类来实现单例设计模式,但最终您会发现95%的需求可以由模块直接定义。获得它的级别全局变量。

因此,与具体的设计模式相比,我觉得一些更抽象的设计原则更适用,更适合在Python开发工作中使用。说到OOP的设计原则,“SOLID”是众多原则中最着名的。

固体设计原则

着名的设计模式书《设计模式:可复用面向对象软件的基础》于1994年出版,已有超过25年的历史。本文的主角:“SOLID设计原则”也并不年轻。

早在2000年,罗伯特C马丁就在他的文章“设计原则和设计模式”中组织并提出了“SOLID”设计原则的原型,然后在他的经典书籍《敏捷软件开发 : 原则、模式与实践》中进行了推广。 “SOLID”由五个单词组合的首字母缩写组成,代表五个不同面向对象域的设计原则。

编写OOP代码时,如果遵循这五个设计原则,则更有可能编写可扩展且易于修改的代码。相反,如果您继续违反这些原则中的一个或多个,您的代码很快就会变得不可扩展且难以维护。

接下来,让我使用一个真正的Python代码示例分别向您解释五个设计原则。

需要注意的第一个注意事项:

“原则”不是“法律”。它只是作为指导。后两者不能违反“原则”。接口与接口有关。 Python没有接口,所以这部分的解释是我个人的理解。文章背后可能有很多代码可能与原版略有不同。请准备好:咖啡:为了增强代码的描述性,本文中的代码使用Python3中的类型注释功能

SOLID原则和Python

黑客新闻(以下简称HN)是程序员社区中的热门网站。在其主页上,在用户提交之后,有许多与推荐算法相关的技术相关内容。

我经常到顶部看一些热门文章,但我觉得每次打开浏览器都有点麻烦。所以,我将编写一个脚本,自动抓取HN Home Top5上的新闻标题和链接,并以纯文本形式将它们写入文件。您可以方便地阅读其他工具。

281443d8cefe4483b60ce26ba7938d2d

图:黑客新闻主页截图

编写爬虫几乎是一个自然的Python游戏。我可以使用诸如requests和lxml等模块提供的有用功能轻松实现上述要求。这是我第一次编写代码:

导入io

导入sys

从键入导入生成器

导入请求

来自lxml import etree

类Post:

标题

:参数链接:链接

: param points:当前得分

: param comments_cnt:评论

'''

Def __init __(self,title: str,link: str,points: str,comments_cnt: str):

Self.title=title

Self.link=link

Self.points=int(points)

Self.comments_cnt=int(comments_cnt)

HNTopPostsSpider类:

'''Crawling 目

: param fp:存储获取结果的目标文件对象

: param 目数,默认为5

'''

ITEMS_URL=' /'

FILE_TITLE='关于HN的最新消息'

Def __init __(self,fp: io.TextIOBase,limit: int=5):

Self.fp=fp

Self.limit=limit

Def fetch(self) - >发电机[发布,无,无]:

'''从HN获取热门内容

'''

Resp=requests.get(self.ITEMS_URL)

#使用XPath,您可以轻松地从页面中解析出所需的内容。以下是页面解析代码

#如果您不熟悉xpath,可以忽略这些代码并直接跳转到yield Post()部分

Html=etree.HTML(resp.text)

Items=html.xpath('//table [