前言

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

    之前一篇文章讲了如何初始化DirectX 11,现在在此基础上绘制一个Cube,总体可概括为以下几个步骤: 定义Cube顶点数据结构 创建Vertex Buffer和Index Buffer 编写应用 ...

  2. hugging face-基于pytorch-bert的中文文本分类

    1.安装hugging face的transformers pip install transformers 2.下载相关文件 字表: wget http://52.216.242.246/model ...

  3. 【原创】Linux PCI驱动框架分析(一)

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  4. jmeter流媒体在线播放HLS插件BlazeMeter - HLS Plugin实现视频在线播放压测

    一.前提 近日因工作需要,需对视频在线播放功能进行压测,视频播放使用的是HLS协议,传输内容包括两部分,一是用来控制播放的m3u8文件,二是TS媒体文件.(HLS协议和m3u8详解可参考此链接:htt ...

  5. 深入理解Spring Security授权机制原理

    原创/朱季谦 在Spring Security权限框架里,若要对后端http接口实现权限授权控制,有两种实现方式. 一.一种是基于注解方法级的鉴权,其中,注解方式又有@Secured和@PreAuth ...

  6. Backdrop Filter

    CSS 滤镜 : backdrop-filter backdrop filter属性允许我们使用css对元素后面的内容应用过滤效果. 滤镜: 名称: 方法案例: 效果: blur() 模糊 filte ...

  7. kickstart+pxe部署

    ------------恢复内容开始------------ kickstart 通过网络安装系统 ----pxe kickstart,cobbler pex 预启动执行环境 通过网络接口启动计算机, ...

  8. idea 【Maven Projects # Profiles】问题记录

    今天启动接一个新项目,然后项目启动后发现启动的环境和预想的不一致,查看 pom 文件确认自己是 dev 无误之后,但是启动的就是 test 环境. 问题 发现了启动环境不对不对之后,自己试了一种解决办 ...

  9. setHeader方法的参数说明

    转自:http://blog.sina.com.cn/s/blog_510fdc8b0100v8sg.html response.setHeader 是用来设置返回页面的头 meta 信息, 使用时 ...

  10. Redis主从复制getshell技巧

    Redis未授权漏洞常见的漏洞利用方式: Windows下,绝对路径写webshell .写入启动项. Linux下,绝对路径写webshell .公私钥认证获取root权限 .利用contrab计划 ...