Python设计模式面向对象编程

1763392456 2021-01-23 11:51:18
Python 设计 面向对象 模式 面向


前言

本篇文章是基于极客时间王争的《设计模式之美》做的总结和自己的理解。
说到面向对象编程,作为一个合格的Pythoner,可以说信手拈来。毕竟在Python里“万物都是对象”嘛,如果别人说你根本不会面向对象编程,或者根本不理解面向对象,那可能会得到你的谩骂,那说到底,你真的懂面向对象吗?试着回答下面几个问题:

  • 面向对象编程的定义是?Python为什么是面向对象编程语言?Python里万物都是对象具体的表现形式是什么?
  • 面向对象的特性是哪四点?在Python里这四点都具备吗?具体是如何实现的?

提示:如果上述的问题回答起来很清晰、很清楚,那本篇文章就可以跳过了,如果感觉思路不清晰,那本篇文章多多少少都会给你代码帮助 !

设计模式简介

在聊面向对象编程之前,先看下设计模式,设计模式主要由编程范式、设计原则、设计模式构成,具体如下图:
在这里插入图片描述
图里概念相对较多,但初步掌握,只要有个大概的印象即可。

谈谈面向对象

面向对象历史

什么是面向对象,从历史说起,我们知道Python正式发布是1991年,Linux正式发布也是1991年,Java正式发布是1995年,Go正式发布是2009年,而面向对象的概念历史发展是:1960年的simula首次提出类和对象的概念,随后70年代的编程语言Smalltalk首次用到面向对象概念,可见面向对象概念提出之早,而随着软件的发展,后续大多数语言都成了面向对象语言,那面向过程的语言有吗?有的,C语言就是典型的面向过程语言。
有兴趣的可以去读一读维基百科,了解下这些语言的发展历史。

  • 面向对象-维基百科
  • Python-维基百科
  • Java-维基百科
  • Linux-维基百科
  • Go-维基百科
面向对象概念

面向对象,即object-oriented,在其下又细分为面向对象分析、面向对象设计、面向对象编程,即OOA(Analysis)、OOD(Design)、OOP(programming)。
如果看了维基百科,可能还是很模糊,通过下图知道关键字:编程范式、包含属性和方法、是类的实例、程序的基本单元、目的是提高软件的扩展性和灵活性。那一句话就是:面向对象是一种编程范式,以类和对象为基本单元,通过封装、抽象、多态、继承这四大特性(不是强要求)来实现代码设计,目的是为了提高软件的可维护性、可扩展性、可复用性。当然上述是我的个人一句话,并不专业,但意思到位即可。
在这里插入图片描述
那Python为啥是面向对象编程语言,很明显,它提供了类和对象这一特性来组织代码,同时也具备了四大特性,那自然是。但不具备四大特性一定不是面向对象编程语言吗?很明显这不具备参考定义,随着软件的发展,很多语言脱离了四大特性,比如Java虽然支持继承,但不具备多继承;比如Go直接放弃了继承这样的特性,而Java和Go又多出了interface这一接口特性,在Python里则不支持,但它们三者都是面向对象编程语言。

万物皆对象

我们经常聊Python万物皆对象,这句话怎么理解?很简单,在Python里我们要构造一个类对象的时候,都是以继承object为前提的,所以判断“万物”是不是对象,只要判断它是不是归属于对象即可,这里的万物概念很广,比较常见的以:数字、字符串、布尔、函数为例,那结果如下:
在这里插入图片描述
为啥都是对象类型呢?我们再以其中的布尔值为例,通过dir发现其内有大量的属性和方法(如下图),那这些方法总不能凭空而来,所以都是继承来的,接下来就比较清晰了,当我们用变量指代数字、字符串等等时,实际上是构造了一个又一个的对象,这些对象具备的魔法方法使其能支持一系列操作,比如__lt__使其具备了比较小于的能力,比如__eq__使其具备了等等于判断的能力。
在这里插入图片描述

面向对象的特性

关于四大特性:封装、抽象、继承、多态,可以看下图的总结:
在这里插入图片描述
Python天然支持四大特性,以前老是对封装和抽象比较模糊,理解为二者都是封装抽象公共代码,然后提供给其他方法调用,这样的理解就很片面了,因为二者的意义相差很大。封装是用于隐藏实现和保护数据,比如Python里我们常在类里定义私有类型来供外部程序调用(如下图),这里可以看到a相当于Java的public关键字,是允许任意调用;而_a则是Pythoner里约定俗成的私有方法,如果调用pycharm这种ide会用波浪线提示用户说是不合法的引用;如果是__a,则相当于Java的private,如果外部调用ide会直接标黄表示错误。
在这里插入图片描述
结果如下:
在这里插入图片描述
至于抽象,广义上的理解即是抽取公共代码,对外暴露相应的方法;狭义上的理解就是接口这样的概念,在接口类里仅包含要暴露的方法,而不透露具体实现,也就是“基于接口而非实现编程”。很可惜,在Python里并不提供接口这一特性,如果你对接口比较模糊的话,可以搜索下接口类 interface,相信会了解到不少信息。但Python里可以通过duck-typing和抽象基类来额外实现抽象,关于这个后续的文章再详细介绍了。
另外继承和多态则是基本语法了,这里也不细说。

总结

本篇文章就到这了,虽然说得都是基础,但相信如果你看完了还是会有一些收获。

版权声明
本文为[1763392456]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/cnoneblog/p/14317008.html

  1. Mandatory conversion of Python data type
  2. Django reported an error: 'key' ID 'not found in' xxx '. Choices are: xxx'
  3. Python 400 sets of large video, starting from the right direction to learn, a complete set to you
  4. 只需十四步:从零开始掌握Python机器学习(附资源)
  5. Just 14 steps: Master Python machine learning from scratch (resources attached)
  6. Python|文件读写
  7. 安利一个Python界神奇得网站
  8. Python | file reading and writing
  9. Amway is a marvelous website in Python world
  10. 第二热门语言:从入门到精通,Python数据科学简洁教程
  11. The second popular language: from introduction to mastery, python data science concise tutorial
  12. 以我的亲身经历,聊聊学python的流程,同时推荐学python的书
  13. With my own experience, I'd like to talk about the process of learning Python and recommend books for learning python
  14. 以我的亲身经历,聊聊学python的流程,同时推荐学python的书
  15. With my own experience, I'd like to talk about the process of learning Python and recommend books for learning python
  16. Django url 路由匹配过程
  17. Django URL routing matching process
  18. 强者一出,谁与争锋?与Python相比,C++的运行速度究竟有多快?
  19. Who will fight against the strong? How fast is C + + running compared with Python?
  20. python 学习体会
  21. Experience of learning Python
  22. python7、8章
  23. Chapter 7 and 8 of Python
  24. python bool和str转换
  25. python——循环(for循环、while循环)及练习
  26. python变量和常量命名、注释规范
  27. python自定义异常捕获异常处理异常
  28. python 类型转换与数值操作
  29. python 元组(tuple)和列表(list)区别
  30. 解决python tkinter 与 sleep 延迟问题
  31. python字符串截取操作
  32. Python bool and STR conversion
  33. Python -- loop (for loop, while loop) and Practice
  34. Specification for naming and annotating variables and constants in Python
  35. Python custom exception capture exception handling exception
  36. Python type conversion and numerical operation
  37. The difference between tuple and list in Python
  38. Solve the delay problem of Python Tkinter and sleep
  39. Python string interception operation
  40. Python 100天速成中文教程,GitHub标星7700
  41. Python 100 day quick Chinese course, GitHub standard star 7700
  42. 以我的親身經歷,聊聊學python的流程,同時推薦學python的書
  43. With my own experience, I'd like to talk about the process of learning Python and recommend books for learning python
  44. python爬虫获取起点中文网人气排行Top100(快速入门,新手必备!)
  45. Python crawler to get the starting point of Chinese network popularity ranking Top100 (quick start, novice necessary!)
  46. 【Python常用包】itertools
  47. Itertools
  48. (国内首发)最新python初学者上手练习
  49. (国内首发)最新python初学者上手练习
  50. (first in China) the latest practice for beginners of Python
  51. (first in China) the latest practice for beginners of Python
  52. (数据科学学习手札104)Python+Dash快速web应用开发——回调交互篇(上)
  53. (data science learning notes 104) Python + dash rapid web application development -- callback interaction (Part 1)
  54. (数据科学学习手札104)Python+Dash快速web应用开发——回调交互篇(上)
  55. (data science learning notes 104) Python + dash rapid web application development -- callback interaction (Part 1)
  56. (資料科學學習手札104)Python+Dash快速web應用開發——回撥互動篇(上)
  57. (materials science learning notes 104) Python + dash rapid web application development -- callback interaction (Part 1)
  58. Python OpenCV 图片高斯模糊
  59. Python OpenCV image Gaussian blur
  60. Stargan V2: converse image synthesis for multiple domains reading notes and Python code analysis