Python 工匠:写好面向对象代码几个原则!

Python面向对象详细总结 md格式 这是我学习Python面向对象的时候自己总结的内容,很多都是从官方文档摘录的,对Python面向对象的编程有非常大的帮助。 立即下载

 

 

 

 

 

Python学习交流群:1004391443

Python 是一门支持多种编程风格的语言,面对相同的需求,拥有不同背景的程序员可能会写出风格迥异的 Python 代码。比如一位习惯编写 C 语言的程序员,通常会定义一大堆函数来搞定所有事情,这是“过程式编程”的思想。而一位有 Java 背景的程序员则更倾向于设计许多个相互关联的类 (class) ,这是 “面向对象编程(后简称 OOP)”。

虽然不同的编程风格各有特点,无法直接比较。但是 OOP 思想在现代软件开发中起到的重要作用应该是毋庸置疑的。

很多人在学习如何写好 OOP 代码时,会选择从那 23 种经典的“设计模式”开始。不过对于 Python 程序员来说,我认为这并非是一个最佳选择。

Python 对 OOP 的支持

Python 语言虽然拥有类、继承、多态等核心 OOP 特性,但和那些完全基于 OOP 思想设计的编程语言 (比如 Java) 相比,它在 OOP 支持方面做了很多简化工作。比如它 没有严格的类私有成员,没有接口(Interface)对象 等。

而与此同时,Python 灵活的函数对象、鸭子类型等许多动态特性又让一些在其他语言中很难做到的事情变得非常简单。这些语言间的差异共同导致了一个结果: 很多经典的设计模式到了 Python 里,就丢失了那个“味道”,实用性也大打折扣。

拿大家最熟悉的单例模式来说。你可以花上一大把时间,来学习如何在 Python 中利用 __new__ 方法或元类 (metaclass) 来实现单例设计模式,但最后你会发现,自己 95% 的需求都可以通过直接定义一个模块级全局变量来搞定。

所以,与具体化的 设计模式 相比,我觉得一些更为抽象的 设计原则 适用性更广、更适合运用到 Python 开发工作中。而谈到关于 OOP 的设计原则,“SOLID” 是众多原则中最有名的一个。

SOLID 设计原则

著名的设计模式书籍《设计模式:可复用面向对象软件的基础》出版于 1994 年,距今已有超过 25 年的历史。而这篇文章的主角: “SOLID 设计原则”同样也并不年轻。

早在 2000 年,Robert C. Martin 就在他的文章 "Design Principles and Design Patterns" 中整理并提出了 “SOLID” 设计原则的雏型,之后又在他的经典著作《敏捷软件开发 : 原则、模式与实践》中将其发扬光大。“SOLID” 由 5 个单词组合的首字母缩写组成,分别代表 5 条不同的面向对象领域的设计原则。

在编写 OOP 代码时,如果遵循这 5 条设计原则,就更可能写出可扩展、易于修改的代码。相反,如果不断违反其中的一条或多条原则,那么很快你的代码就会变得不可扩展、难以维护。

接下来,让我用一个真实的 Python 代码样例来分别向你诠释这 5 条设计原则。

写在最前面的注意事项:

  1. “原则”不是“法律”,它只起到指导作用,并非不可以违反
  2. “原则”的后两条与接口(Interface)有关,而 Python 没有接口,所以对这部分的诠释是我的个人理解,与原版可能略有出入
  3. 文章后面的内容含有大量代码,请做好心理准备 :coffee:️
  4. 为了增强代码的说明性,本文中的代码使用了 Python3 中的 类型注解特性

SOLID 原则与 Python

Hacker News (后简称 HN) 是一个在程序员圈子里很受欢迎的站点。在它的首页,有很多由用户提交后基于推荐算法排序的科技相关内容。

我经常会去上面看一些热门文章,但我觉得每次打开浏览器访问有点麻烦。所以,我准备编写一个脚本,自动抓取 HN 首页 Top5 的新闻标题与链接,并用纯文本的方式写入到文件。方便自己用其他工具阅读。

 

 

 

图:Hacker News 首页截图

编写爬虫几乎是 Python 天生的拿手好戏。利用 requests、lxml 等模块提供的好用功能,我可以轻松实现上面的需求。下面是我第一次编写好的代码:

你可以把上面的代码称之为符合 OOP 风格的,因为在上面的代码里,我定义了两个类:

  1. Post :表示单个 HN 内容条目,其中定义了标题、链接等字段,是用来衔接“抓取”和“写入文件”两件事情的数据类
  2. HNTopPostsSpider :抓取 HN 内容的爬虫类,其中定义了抓取页面、解析、写入结果的方法,是完成主要工作的类

如果你本地的 Python 环境配置正常,那么可以尝试执行一下上面这段代码,它会输出下面这样的内容:

这个脚本基于面向对象的方式编写 (换句话说,就是定义了一些 class :unamused:) ,可以满足我的需求。但是从设计的角度来看,它却违反了 SOLID 原则的第一条:“Single responsibility principle(单一职责原则)”,让我们来看看是为什么。

S:单一职责原则

SOLID 设计原则里的第一个字母 S 来自于 “Single responsibility principle(单一职责原则)” 的首字母。这个原则认为: “一个类应该仅仅只有一个被修改的理由。” 换句话说,每个类都应该只有一种职责。

而在上面的代码中, HNTopPostsSpider 这个类违反了这个原则。因为我们可以很容易的找到两个不同的修改它的理由:

  • 理由 1: HN 网站的程序员突然更新了页面样式,旧的 xpath 解析算法从新页面上解析不到内容,需要修改 fetch 方法内的解析逻辑。
  • 理由 2: 用户 (也就是我) 突然觉得纯文本格式的输出不好看,想要改成 Markdown 样式。需要修改 write_to_file 方法内的输出逻辑。

所以, HNTopPostsSpider 类违反了“单一职责原则”,因为它有着多个被修改的理由。而这背后的根本原因是因为它承担着 “抓取帖子列表” 和 "将帖子列表写入文件" 这两种完全不同的职责。

违反“单一职责原则”的坏处

如果某个类违反了“单一职责原则”,那意味着我们经常会因为不同的原因去修改它。这可能会导致不同功能之间相互影响。比如,可能我在某天调整了页面解析逻辑,却发现输出的文件格式也全部乱掉了。

另外,单个类承担的职责越多,意味着这个类的复杂度也就越高,它的维护成本也同样会水涨船高。违反“单一职责原则”的类同样也难以被复用,假如我有其他代码想复用 HNTopPostsSpider 类的抓取和解析逻辑,会发现我必须要提供一个莫名其妙的文件对象给它才行。

那么,要如何修改代码才能让它遵循“单一职责原则”呢?办法有很多,最传统的是: 把大类拆分为小类 。

拆分大类为多个小类

为了让 HNTopPostsSpider 类的职责更纯粹,我们可以把其中与“写入文件”相关的内容拆分出去作为一个新的类:

而在 HNTopPostsSpider 类里,可以通过调用 PostsWriter 的方式来完成之前的工作:

通过这种方式,我们让 HNTopPostsSpider 和 PostsWriter 类都各自满足了“单一职责原则”。我只会因为解析逻辑变动才去修改 HNTopPostsSpider 类,同样,修改 PostsWriter 类的原因也只有调整输出格式一种。这两个类各自的修改可以单独进行而不会相互影响。

另一种方案:使用函数

“单一职责原则”虽然是针对类说的,但其实它的适用范围可以超出类本身。比如在 Python 中,通过定义函数,同样也可以让上面的代码符合单一职责原则。

我们可以把“写入文件”的逻辑拆分为一个新的函数,由它来专门承担起将帖子列表写入文件的职责:

而对于 HNTopPostsSpider 类来说,改动可以更进一步。这次我们可以直接删除其中和文件写入相关的所有代码。让它只负责一件事情:“获取帖子列表”。

相应的,类和函数的调用方 main 函数就需要稍作调整,它需要负责把 write_posts_to_file 函数和 HNTopPostsSpider 类之间协调起来,共同完成工作:

将“文件写入”职责拆分为新函数是一个 Python 特色的解决方案,它虽然没有那么 OO (面向对象) ,但是同样满足“单一职责原则”,而且在很多场景下更灵活与高效。

O:开放-关闭原则

O 来自于 “Open–closed principle(开放-关闭原则)” 的首字母,它认为: “类应该对扩展开放,对修改封闭。” 这是一个从字面上很难理解的原则,它同样有着另外一种说法: “你应该可以在不修改某个类的前提下,扩展它的行为。”

这原则听上去有点让人犯迷糊,如何能做到不修改代码又改变行为呢?让我来举一个例子:你知道 Python 里的内置排序函数 sorted 吗?

如果我们想对某个列表排序,可以直接调用 sorted 函数:

现在,假如我们想改变 sorted 函数的排序逻辑。比如,让它使用所有元素对 3 取余后的结果来排序。我们是不是需要去修改 sorted 函数的源码?当然不用,只需要在调用 sort 函数时,传入自定义的排序函数 key 参数就行了:

通过上面的例子,我们可以认为: sorted 函数是一个符合“开放-关闭原则”的绝佳例子,因为它:

  • 对扩展开放:你可以通过传入自定义 key 函数来扩展它的行为
  • 对修改关闭:你无需修改 sort 函数本身

如何违反“开放-关闭原则”

现在,让我们回到爬虫小程序。在使用了一段时间之后,用户 (还是我) 觉得每次抓取到的内容有点不合口味。我其实只关注那些来自特定网站,比如 github 上的内容。所以我需要修改 HNTopPostsSpider 类的代码来对结果进行过滤:

完成修改后,让我们来简单测试一下效果:

看上去新加的过滤代码起到了作用,现在只有链接中含有 github 的内容才会被写入到结果中。

但是,正如某位哲学家的名言所说: “这世间唯一不变的,只有变化本身。” 某天,用户 (永远是我) 突然觉得,来自 bloomberg 的内容也都很有意思,所以我想要把 bloomberg 也加入筛选关键字逻辑里。

这时我们就会发现:现在的代码违反了"开放-关闭原则"。因为我必须要修改现有的 HNTopPostsSpider 类代码,调整那个 if'github'inlink.lower() 判断语句才能完成我的需求。

“开放-关闭原则”告诉我们,类应该通过扩展而不是修改的方式改变自己的行为。那么我应该如何调整代码,让它可以遵循原则呢?

使用类继承来改造代码

继承是面向对象理论中最重要的概念之一。它允许我们在父类中定义好数据和方法,然后通过继承的方式让子类获得这些内容,并可以选择性的对其中一些进行重写,修改它的行为。

使用继承的方式来让类遵守“开放-关闭原则”的关键点在于: 找到父类中会变动的部分,将其抽象成新的方法(或属性),最终允许新的子类来重写它以改变类的行为。

对于 HNTopPostsSpider 类来说。首先,我们需要找到其中会变动的那部分逻辑,也就是 “判断是否对条目感兴趣” ,然后将其抽象出来,定义为新的方法:

如果我们只关心来自 github 的帖子,那么只需要定义一个继承于 HNTopPostsSpider 子类,然后重写父类的 interested_in_post 方法即可。

假如我们的兴趣发生了变化?没关系,增加新的子类就行:

所有的这一切,都不需要修改原本的 HNTopPostsSpider 类的代码,只需要不断在它的基础上创建新的子类就能完成新需求。最终实现了对扩展开放、对改变关闭。

使用组合与依赖注入来改造代码

虽然类的继承特性很强大,但它并非唯一办法,依赖注入(Dependency injection) 是解决这个问题的另一种思路。与继承不同,依赖注入允许我们在类实例化时,通过参数将业务逻辑的变化点: 帖子过滤算法 注入到类实例中。最终同样实现“开放-关闭原则”。

首先,我们定义一个名为 PostFilter 的抽象类:

Hint:定义抽象类在 Python 的 OOP 中并不是必须的,你也可以不定义它,直接从下面的 DefaultPostFilter 开始。

然后定义一个继承于该抽象类的默认 DefaultPostFilter 类,过滤逻辑为保留所有结果。之后再调整一下 HNTopPostsSpider 类的构造方法,让它接收一个名为 post_filter 的结果过滤器:

默认情况下, HNTopPostsSpider.fetch 会保留所有的结果。假如我们想要定义自己的过滤算法,只要新建自己的 PostFilter 类即可,下面是两个分别过滤 GitHub 与 BloomBerg 的 PostFilter 类:

在 main() 函数中,我可以用不同的 post_filter 参数来实例化 HNTopPostsSpider 类,最终满足不同的过滤需求:

与基于继承的方式一样,利用将“过滤算法”抽象为 PostFilter 类并以实例化参数的方式注入到 HNTopPostsSpider 中,我们同样实现了“开放-关闭原则”。

使用数据驱动思想来改造代码

在实现“开放-关闭”原则的众多手法中,除了继承与依赖注入外,还有一种经常被用到的方式: “数据驱动” 。这个方式的核心思想在于: 将经常变动的东西,完全以数据的方式抽离出来。当需求变动时,只改动数据,代码逻辑保持不动。

它的原理与“依赖注入”有一些相似,同样是把变化的东西抽离到类外部。不同的是,后者抽离的通常是类,而前者抽离的是数据。

为了让 HNTopPostsSpider 类的行为可以被数据驱动,我们需要使其接收 filter_by_link_keywords 参数:

调整了初始化参数后,还需要在 main 函数中定义 link_keywords 变量并将其传入到 HNTopPostsSpider 类的构造方法中,之后所有针对过滤关键词的调整都只需要修改这个列表即可,无需改动 HNTopPostsSpider 类的代码,同样满足了“开放-关闭原则”。

与前面的继承和依赖注入方式相比,“数据驱动”的代码更简洁,不需要定义额外的类。但它同样也存在缺点: 它的可定制性不如前面的两种方式 。假如,我想要以“链接是否以某个字符串结尾”作为新的过滤条件,那么现在的数据驱动代码就有心无力了。

如何选择合适的方式来让代码符合“开放-关闭原则”,需要根据具体的需求和场景来判断。这也是一个无法一蹴而就、需要大量练习和经验积累的过程。

总结

在这篇文章中,我通过一个具体的 Python 代码案例,向你描述了 “SOLID” 设计原则中的前两位成员: “单一职责原则” 与 “开放-关闭原则” 。

这两个原则虽然看上去很简单,但是它们背后蕴藏了许多从好代码中提炼而来的智慧。它们的适用范围也不仅仅局限在 OOP 中。一旦你深入理解它们后,你可能会惊奇的在许多设计模式和框架中发现它们的影子 (比如这篇文章就出现了至少 3 种设计模式,你知道是哪些吗?) 。

让我们最后再总结一下吧:

  • “S: 单一职责原则”认为一个类只应该有一种被修改的原因
  • 编写更小的类通常更不容易违反 S 原则
  • S 原则同样适用于函数,你可以让函数和类协同工作
  • “O: 开放-关闭原则”认为类应该对改动关闭,对扩展开放
  • 找到需求中频繁变化的那个点,是让类遵循 O 原则的重点所在
  • 使用子类继承的方式可以让类遵守 O 原则
  • 通过定义算法类,并进行依赖注入,也可以让类遵循 O 原则
  • 将数据与逻辑分离,使用数据驱动的方式也是改造代码的好办法

 

HTOL集成电路老化测试学习总结-20250510 电子元器件的可靠性在产品开发中至关重要,尤其是在微电子技术迅速发展的今天。电子元器件的失效率通常遵循“浴盆曲线”,分为早期失效期、可使用期和老化期。为了评估芯片的可靠性,常采用高温操作寿命测试(HTOL),通过高温和高压加速芯片老化,以筛选出早期失效的芯片并评估其长期可靠性。HTOL测试中,芯片在高温下运行并监控其性能变化,通过阿伦尼乌斯公式计算加速因子,预测芯片的失效率和寿命。此外,Burn-in测试用于加速芯片老化,提前发现并剔除不合格产品,而早期失效率测试(ELFR)则用于评估产品初期使用阶段的可靠性 阅读详情

相关推荐

关于获取CISP-PTE一些避坑经历

考场内是不允许携带外设键盘的,现场会至少有一个360安全专业人员监考.所有人电脑都会提前装一个奇安信的一个考试exe,刚开始的时候会让你连接一个WIFI,我们将会通过WIFI进行做题,做题期间你的电脑将被全程监控并且一些退出快捷键也是全部锁死(有点像勒索病毒那种界面),想要重启必须直接拔电源。中途可以上厕所,需要监考官陪同

6323

面向对象设计原则-实例说明

面向对象设计中的五个常见原则(SOLID)及其Python示例,这些原则帮助设计出高内聚、低耦合的系统,提升代码的可维护性和扩展性。

linkedin_21843693的博客 467

保姆级教程:用PyBullet和Stable-Baselines3搞定你的第一个机器人强化学习项目

本文提供了一份详细的PyBullet和Stable-Baselines3教程,帮助开发者快速上手机器人强化学习项目。通过环境配置、自定义Gym环境构建、PPO算法参数优化及模型部署的全流程解析,读者将掌握从零开始训练四足机器人 locomotion 任务的完整技术方案。

weixin_26861329的博客 421

Python面向对象设计原则

在 Python 中,字符串是一种用于表示文本数据的数据类型,它是不可变的(immutable)序列,可以包含字符、数字和符号等数据。字符串是 Python 中最常用的数据类型之一,它有丰富的内置方法和操作,用于处理文本数据。

Fddadd的博客 276

配电网故障重构/孤岛划分/故障恢复

程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》,采用matlab编程软件实现,依据网络结构和DG供电方式对配电网进行孤岛划分,将含有 DG 的配电网拓扑结构看成一个树,搭建成连通图模型,使得将孤岛的划分变成了求取最小生成树,以网损和开关开断次数作为目标,采用 IEEE33 节点配电网为算例,通过遗传算法寻优计算,从而得到最佳的重构方案。

zhangxd212489的博客 2500

操作系统期末大题类型题解

额,OS主要这回考程序分析题,PV操作、生产者消费者啊,哲学家进餐问题,死锁问题啊,如何避免死锁,经典银行家算法,页面置换算法啥的,磁盘调度......总计还有很多,就不一一说了 PV操作 谈到PV操作,首先要了解什么是信号量,其实就是用来解决互斥与同步问题的,分为原语wait(S)和signal(S),也就是我们常说的PV操作,在这里给出王道上的概念 wait(S){ while(S>0) S=S-1; } signal(S){ S=S+1; } 记录型信号量

ZXxxiaoxuan的博客 795

Python面向对象编程原则

本文详细介绍了Python 面向对象编程的七大设计原则,使之更好的理解面向对象编程

m0_60981735的博客 1573

【go-libp2p学习笔记】使用go-libp2p搭建中转服务器(circuit relay server)

libp2p算是一个蛮新的库,提供了非常强大的p2p节点发现/连接/通信能力。IPFS的基石。 中文网上的**技术教程**比较少,所以抛砖引玉开一点坑来体验一下!

Cake_C的博客 6493

Python的编码规范PEP8

PEP8 Python 编码规范一 代码编排1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。二 文档编排1 模块内容的顺序:模块说明和doc...

woailuohui的专栏 496

基于STM32与FPGA的数据采集系统的设计与实现

数据采集系统在现代工程中起着至关重要的作用,用于实时获取和处理各种传感器或外部设备的数据。在本文中,我们将探讨如何基于STM32微控制器和FPGA(现场可编程门阵列)实现一个高效的数据采集系统。我们可以使用STM32的UART、SPI或I2C接口与各种传感器或外部设备进行通信,并通过GPIO口实现控制功能。在硬件连接完成后,我们可以通过STM32控制FPGA的配置和数据传输。STM32作为主控单元负责与外部设备进行通信和数据处理,而FPGA则用于高速数据采集和实时处理。具体的通信协议取决于连接的设备类型。

UbiSqlserver的博客 1797

华为OD机试 - 名字的漂亮度(Java 牛客练习题)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。给出多个字符串,计算每个字符串最大可能的“漂亮度”。第一行一个整数N,接下来N行每行一个字符串。数据范围:输入的名字长度满足。每个字符串可能的最大漂亮程度。

学Java,找哪吒 1786

Python 进阶 — 面向对象设计原则

目录 文章目录目录开放/封闭原则控制反转原则接口隔离原则单一职责原则替换原则 开放/封闭原则 开放/封闭原则,类和对象及其方法对于扩展来说,是开放的;对于修改来说,是要封闭的。 现有的类不会被修改,因此退化的可能性较小。 有助于保持以前代码的向后兼容性。 控制反转原则 控制反转原则,高层级的模块不应该依赖于低层级的模块,它们应该依赖于抽象(接口)。任何两个模块都不应以紧密的方式相互依赖。 消弱了模块间的紧耦合,因此消除了系统中的复杂性。 由于依赖模块之间有一个明确的抽象层(由接口、或钩子提供),因此便

烟云的计算 1402

Arcgis模型构建器01——写一个简单的模型

在使用模型构建器解决这个需求之前,我们要想清楚如果我们手动解决的话,应该如何去处理,因为构建模型的过程正是基于我们手动处理的过程来构建的。我有一个全国的dem影像数据和一个陕西省边界范围矢量,现在我想获取陕西省的dem影像的坡度数据。填写完之后点击确定,我们发现,两个输入数据和工具连接起来了,并且通过裁剪工具得到一个中间结果,即。我们发现工具框和中间数据框都存在阴影,说明已经运行过了这个模型,不报错就说明模型运行成功!现在我们就把数据和工具都串联起来了,成功构建好了模型。

爱吃雪糕的小布丁的博客 920

14-Python 工匠:写好面向对象代码的原则(下)

依赖倒置原则”与“接口隔离原则”。这两条原则之间有一个共同点,那就是它们都和“抽象”有着紧密的联系。前者告诉我们要面向抽象而非实现编程,后者则教导我们在设计抽象时应该做到精准。“D:依赖倒置原则”认为高层模块和低层模块都应该依赖于抽象依赖抽象,意味着我们可以完全修改低层实现,而不影响高层代码在 Python 中你可以使用 abc 模块来定义抽象类除 abc 外,你也可以使用其他技术来完成依赖倒置“I:接口隔离原则”认为客户不应该依赖任何它不使用的方法设计接口就是设计抽象。

wujianyouhun的专栏 949

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

12- Python 工匠:写好面向对象代码的原则(上)

单一职责原则”与“开放-关闭原则”。这两个原则虽然看上去很简单,但是它们背后蕴藏了许多从好代码中提炼而来的智慧。它们的适用范围也不仅仅局限在 OOP 中。一旦你深入理解它们后,你可能会惊奇的在许多设计模式和框架中发现它们的影子(比如这篇文章就出现了至少 3 种设计模式,你知道是哪些吗?。“S: 单一职责原则”认为一个类只应该有一种被修改的原因编写更小的类通常更不容易违反 S 原则S 原则同样适用于函数,你可以让函数和类协同工作“O: 开放-关闭原则”认为类应该对改动关闭,对扩展开放。

wujianyouhun的专栏 1236

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

点击上方“涛哥聊Python”,选择“星标”公众号重磅干货,第一时间送达本文转载自piglei,禁二次转载Python 是一门支持多种编程风格的语言,面对相同的需求,拥有...

涛哥聊Python 560

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

13-Python 工匠:写好面向对象代码的原则(中)

里氏替换原则。“里氏替换原则”是一个非常具体的原则,它专门为 OOP 里的继承场景服务。当你设计类继承关系,尤其是编写子类代码时,请经常性的问自己这个问题:“如果我把项目里所有使用父类的地方换成这个子类,程序是否还能正常运行?如果答案是否定的,那么你就应该考虑调整一下现在的类设计了。调整方式有很多种,有时候你得把大类拆分为更小的类,有时候你得调换类之间的继承关系,有时候你得为父类添加新的方法和属性,就像文章里的第一个场景一样。只要开动脑筋,总会找到合适的办法。“L:里氏替换原则”

wujianyouhun的专栏 1100

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

Python 是一门支持多种编程风格的语言,面对相同的需求,拥有不同背景的程序员可能会写出风格迥异的 Python 代码。比如一位习惯编写 C 语言的程序员,通常会定义一大堆函数来搞定所有事情,这是 “过程式编程” 的思想。而一位有 Java 背景的程序员则更倾向于设计许多个相互关联的类 (class) ,这是 “面向对象编程(后简称 OOP)” 。 虽然不同的编程风格各有特点,无法直接比较。...

Pythoncxy的博客 265

python编写ATM类_Python 工匠:写好面向对象代码几个原则

点击上方“涛哥聊Python”,选择“星标”公众号重磅干货,第一时间送达本文转载自piglei,禁二次转载Python 是一门支持多种编程风格的语言,面对相同的需求,拥有不同背景的程序员可能会写出风格迥异的 Python 代码。比如一位习惯编写 C 语言的程序员,通常会定义一大堆函数来搞定所有事情,这是“过程式编程”的思想。而一位有 Java 背景的程序员则更倾向于设计许多个相互关联的类...

weixin_39570838的博客 376

python中面向对象的ui_Python 工匠:写好面向对象代码的原则(上)

????点击上方蓝字“Python猫”,免费获得一个公众号花下猫语:今天继续给大家分享一篇好文章,有助于 Python 进阶的。Python 是一门支持面向对象的语言,但它跟典型的面向对象语言不完全相同。如何在 Python 中写出良好的面向对象代码呢?全文较长,建议收藏后慢慢阅读。图 | 宫崎骏电影《侧耳倾听》作者:piglei |公众号:piglei(本文经原作者授权转载,不得二次转载)...

weixin_39767645的博客 124

Python 工匠精神

我一直觉得编程某种意义上是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目。 在雕琢代码的过程中,有大工程:比如应该用什么架构、哪种设计模式。也有更多的小细节,比如何时使用异常(Exceptions)、或怎么给变量起名。那些真正优秀的代码,正是由无数优秀的细节造就的。 『Python 工匠』这个系列文章,是我的一次小小尝试。它专注于分享 Python 编程中的一些偏『小』的东西。希望能够帮到每一位编程路上的匠人。 ...

qq_17122127的博客 857

eclipse和idea代码通用吗_Python 工匠:写好面向对象代码的原则(中)

文章来源于piglei ,作者piglei在这篇文章中,我将继续介绍 SOLID 原则的第三位成员:L(里氏替换原则)。里氏替换原则与继承在开始前,我觉得有必要先提一下 继承(Inheritance)。因为和前面两条非常抽象的原则不同,“里氏替换原则”是一条非常具体的,和类继承有关的原则。在 OOP 世界里,继承算是一个非常特殊的存在,它有点像一把无坚不摧的双刃剑,强大且危险。合理使用继承,可以大...

weixin_39728544的博客 1259

1-Python 工匠:善用变量来改善代码质量

这个原则属于老生常谈了。很多人(包括我)在刚开始学习编程时,会有一个习惯。就是把所有的变量定义写在一起,放在函数或方法的最前面。path = []... ...这样做只会让你的代码『看上去很整洁』,但是对提高代码可读性没有任何帮助。更好的做法是,让变量定义尽量靠近使用。那样当你阅读代码时,可以更好的理解代码的逻辑,而不是费劲的去想这个变量到底是什么、哪里定义的?# 为所有性别为女性,或者级别大于 3 的活跃用户发放 10000 个金币return看见if后面那一长串了吗?有点难读对不对?

wujianyouhun的专栏 1068

Python开发必看书籍:《Python工匠》

python相关的就业方向很多,学校开设的python课程大多集中在数据分析和数据挖掘领域。然而实际工作中,算法工程师完成模型算法之后,往往还需要负责接口的开发上线。偏工程的数据治理方向偏业务的数据分析方向偏算法的数据挖掘方向偏开发的数据开发方向偏产品的数据产品经理我在入职两年的时候负责了一个大项目的开发工作,设计了5个功能模块,接入了1个查询接口2个数据库7个预测模型,一整套弄下来非常的struggle。Python开发远比我预期的难度要大。

2401_84205765的博客 1835

里氏替换原则_Python 工匠:写好面向对象代码的原则(中)

前言 这是 “Python 工匠”系列的第 13 篇文章。[查看系列所有文章]在 上一篇文章 里,我用一个虚拟小项目作为例子,讲解了“SOLID”设计原则中的前两位成员:S(单一职责原则)与 O(开放-关闭原则)。在这篇文章中,我将继续介绍 SOLID 原则的第三位成员:L(里氏替换原则)。里氏替换原则与继承在开始前,我觉得有必要先提一下 继承(Inheritance)。因为和前面两条非常抽象的原...

weixin_39966465的博客 170

依赖倒置原则_Python 工匠:写好面向对象代码的原则(下)

(给Python开发者加星标,提升Python技能)来源:piglei在这篇文章中,我将继续介绍 SOLID 原则剩下的两位成员:I(接口隔离原则) 和 D(依赖倒置原则)。为了方便,这篇文章将会使用先 D 后 I 的顺序。D:依赖倒置原则软件是由一个个模块组合而成的。当你跟别人说:“我在写一个很复杂的软件”,其实你并不是直接在写那个软件,你只是在编写它的一个个模块,最后把它们放在一起组...

weixin_39668496的博客 182
上一篇: 这个库厉害了,自动补全Python代码,节省50%敲码时间!
下一篇: 用Python实现数据预处理!
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值