前言

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

  10. Python基础 — 面向对象编程基础

    目录 1. 面向对象编程基础 2. 定义类和创建对象 3. init() 方法 4. 魔法方法 5. 访问可见性问题 5. 练习 1. 面向对象编程基础 把一组数据结构和处理它们的方法组成对象(obj ...

随机推荐

  1. Spark源码编译并在YARN上运行WordCount实例

    在学习一门新语言时,想必我们都是"Hello World"程序开始,类似地,分布式计算框架的一个典型实例就是WordCount程序,接触过Hadoop的人肯定都知道用MapRedu ...

  2. Redis学习笔记~分布式的Pub/Sub模式

    回到目录 redis的客户端有很多,这次用它的pub/sub发布与订阅我选择了StackExchange.Redis,发布与订阅大家应该很清楚了,首先一个订阅者,订阅一个服务,服务执行一些处理程序(可 ...

  3. Linux下开发常用 模拟 Http get和post请求

    1.get请求 curl "http://www.baidu.com"      如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "htt ...

  4. C# Cookie工具类

    /// <summary> /// Cookies赋值 /// </summary> /// <param name="strName">主键& ...

  5. ASP.NET WEB API 中的路由调试与执行过程跟踪

    路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...

  6. Leetcode#126 Word Ladder II

    原题地址 既然是求最短路径,可以考虑动归或广搜.这道题对字典直接进行动归是不现实的,因为字典里的单词非常多.只能选择广搜了. 思路也非常直观,从start或end开始,不断加入所有可到达的单词,直到最 ...

  7. Android 学习手札(一) 应用程序架构

    1.资源列表 Android支持的资源列表 目   录 资源类型 描述 res/anim  XML  该目录用于存放帧(frame).动画或补间(tweened)动画文件 res/drawable   ...

  8. stagefright框架(五)-Video Rendering

    AwesomePlayer::onVideoEvent除了透過OMXCodec::read取得解碼後的資料外,還必須將這些資料(mVideoBuffer)傳給video renderer,以便畫到螢幕 ...

  9. HDU 5821 Ball

    记录一下每个位置最终到达的位置.然后每次操作排序. #pragma comment(linker, "/STACK:1024000000,1024000000") #include ...

  10. PentestBox在win10里打不开工具

    PentestBox详细安装过程:http://www.cnblogs.com/ESHLkangi/p/8336398.html 在使用PentestBox的时候出现了打不开工具的问题,最后看到一个老 ...