前言

  本篇文章是基于极客时间王争的《设计模式之美》做的总结和自己的理解。
  说到面向对象编程,作为一个合格的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和抽象基类来额外实现抽象,关于这个后续的文章再详细介绍了。
  另外继承和多态则是基本语法了,这里也不细说。

总结

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

Python设计模式面向对象编程的更多相关文章

  1. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  2. Python之面向对象编程学习

    不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...

  3. Python:面向对象编程3 定制类(有更新)

    Python:面向对象编程3  定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...

  4. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  5. python之面向对象编程

    1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...

  6. Python(面向对象编程—1)

    class tst: l=[] x=1 a=tst() b=tst() a.l.append('a') b.l.append('b') a.x='a' b.x='b' print(a.l,a.x) # ...

  7. python的面向对象编程

    面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们 ...

  8. 一文看懂Python的面向对象编程

    之前在网络上看了很多关于面向对象的编程详解,还是不够过瘾,所以决定自己动手写一篇. 面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计. 类(Class) ...

  9. python学习——面向对象编程

    关于python面向对象编程,请参考: https://blog.csdn.net/zhoudaxia/article/details/23341261

随机推荐

  1. 找和为K的两个元素

    总时间限制:1000ms 内存限制: 65536kB 描述 在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k. 输入 第一行输入序列的长度n和k,用空格分开. 第二 ...

  2. 工作3年,看啥资料能月薪30K?

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

  3. 快速理解Python异步编程的基本原理

    第一个例子 假设你需要用电饭煲煮饭,用洗衣机洗衣服,给朋友打电话让他过来吃饭.其中,电饭煲需要30分钟才能把饭煮好,洗衣机需要40分钟才能把衣服洗好,朋友需要50分钟才能到你家.那么,是不是你需要在这 ...

  4. 【入门必看】不理解「对象」?很可能有致命bug:简单的Python例子告诉你

    简介:越来越多的人要在学习工作中用到『编程』这个工具了,其中很大一部分人用的是Python.大部分人只是做做简单的科研计算.绘图.办公自动化或者爬虫,但-- 这就不需要理解「指针与面向对象」了吗? 在 ...

  5. H3C路由器配置——动态路由OSPF协议

    一.介绍 1.OSPF协议介绍 (1).OSPF(Open Shortest Path First,开放最短路径优先)路由协议是用于网际协议(IP)网络的链路状态路由协议.是一个被各厂商设备广泛支持的 ...

  6. 死磕以太坊源码分析之txpool

    死磕以太坊源码分析之txpool 请结合以下代码阅读:https://github.com/blockchainGuide/ 写文章不易,也希望大家多多指出问题,交个朋友,混个圈子哦 交易池概念原理 ...

  7. 手摸手带你学CSS

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star HTML常用标签总结 前言 在大一的时候,上过网页设计的课 ...

  8. sql去除重复的几种方法

    所以用这样一句SQL就可以去掉重复项了: select * from msg group by terminal_id; SQL中distinct的用法(四种示例分析) 示例1 select dist ...

  9. Screaming Frog SEO Spider页面分析工具使用方法

    一.  下载地址:https://www.screamingfrog.co.uk/seo-spider/ 二.  使用教程 链接1: https://blog.csdn.net/a055350/art ...

  10. JavaDailyReports10_08

    ------------恢复内容开始------------ AWT组件 1.1Frame组件与Panel组件 1.1.1显示框架窗口 1 package awt; 2 3 import java.a ...