前言

  本篇文章是基于极客时间王争的《设计模式之美》做的总结和自己的理解。
  说到面向对象编程,作为一个合格的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. 华为Mate20 Adb驱动失败

    今天拿到同事一台华为Mate20,准备装个包,结果发现adb一直 no devices,AndroidStudio当然也显示 no connected devices 开发者模式也打开了,USB调试也 ...

  2. java基础:数组详解以及应用,评委打分案例实现,数组和随机数综合,附练习案列

    1.数组 1.1 数组介绍 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致. 1.2 数组的定义格式 1.2.1 第一种格式 数据类型[] 数组名 示例: int[] arr;     ...

  3. 使用form表单上传文件

    在使用form表单上传文件时候,input[type='file']是必然会用的,其中有一些小坑需要避免. 1.form的 enctype="multipart/form-data" ...

  4. 30G 上亿数据的超大文件,如何快速导入生产环境?

    Hello,大家好,我是楼下小黑哥~ 如果给你一个包含一亿行数据的超大文件,让你在一周之内将数据转化导入生产数据库,你会如何操作? 上面的问题其实是小黑哥前段时间接到一个真实的业务需求,将一个老系统历 ...

  5. 老吕教程--01后端Node.js框架搭建(安装调试KOA2)

    今天开始从零搭建后端框架,后端框架基于Koa2,通过Typescript语言编写. 在写后端框架之前,自己也了解过Express,感觉Koa2更加灵活,由于有多年后端研发经验,所以采用Koa2,简单敏 ...

  6. 深度实战玩转算法, Java语言7个经典应用诠释算法精髓

    深度实战玩转算法,以Java语言主讲,通过7款经典好玩游戏,真正将算法用于实际开发,由算法大牛ACM亚洲区奖牌获得者liuyubobobo主讲,看得见的算法,带领你进入一个不一样的算法世界,本套课程共 ...

  7. EF Core 三 、 骚操作 (导航属性,内存查询...)

    EF Core 高阶操作 本文之前,大家已经阅读了前面的系列文档,对其有了大概的了解 我们来看下EF Core中的一些常见高阶操作,来丰富我们业务实现,从而拥有更多的实现选择 1.EF 内存查找 wh ...

  8. PHP代码审计05之正则使用不当

    前言 根据红日安全写的文章,学习PHP代码审计的第五节内容,题目均来自PHP SECURITY CALENDAR 2017,讲完题目会用一道CTF的题目和实例来加深巩固.这是之前写的,有兴趣可以去看看 ...

  9. linux学习之--虚拟机安装linux【centerOS】

    计划把学习中的软件安装使用记录下来,以下是使用VMware 按照 Linux 使用桥接网络虚拟机和windows中都有不同的ip地址

  10. 数据库分库分表容量划分建议参考阿里云DRDS原则

    做分库分表的时候 一直想知道分库分表容量的最优规则有什么好的建议,以下是参考阿里云 DRDS 分库分表的规则,还是有一定的参考意义 .