Python 核心技术与实战
景霄
Facebook 资深工程师
78765 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

11 | 面向对象(上):从生活中的类比说起

你好,我是景霄。
很多朋友最开始学编程的时候,是从 C++ 或者 JAVA 语言入手的。他们好不容易磕磕绊绊地搞懂了最基本的数据类型、赋值判断和循环,却又迎面撞上了 OOP (object oriented programming) 的大墙,一头扎进公有私有保护、多重继承、多态派生、纯函数、抽象类、友元函数等一堆专有名词的汪洋大海中找不到彼岸,于是就放弃了进阶之路。
相比之下,Python 是一门相对友好的语言,它在创立之初就鼓励命令交互式的轻量级编程。理论上,Python 的命令式语言是图灵完备的, 也就是说命令式语言,理论上可以做到其他任何语言能够做到的所有的事情,甚至进一步,仅仅依靠汇编语言的 MOV 指令,就能实现图灵完备编程
那么为什么不这样做呢?其实,“上古时代”的程序员就是这么做的,可是随着程序功能复杂性的逐步提升,以及需求的不断迭代,很多老旧的代码修改起来麻烦无比,牵一发而动全身,根本无法迭代和维护,甚至只能推倒重来,这也是很多古老的代码被称为“屎山”的原因。
传统的命令式语言有无数重复性代码,虽然函数的诞生减缓了许多重复性,但随着计算机的发展,只有函数依然不够,需要把更加抽象的概念引入计算机才能缓解(而不是解决)这个问题,于是 OOP 应运而生。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(107)

  • 最新
  • 精选
  • Jingxiao
    置顶
    思考题答案:庄小P 同学的写法很好,非常明确的表明了菱形继承潜在的问题:一个基类的初始化函数可能被调用两次。在一般的工程中,这显然不是我们所希望的。正确的做法应该是使用 super 来召唤父类的构造函数,而且 python 使用一种叫做方法解析顺序的算法(具体实现算法叫做 C3),来保证一个类只会被初始化一次。 class A(): def __init__(self): print('enter A') print('leave A') class B(A): def __init__(self): print('enter B') super().__init__() print('leave B') class C(A): def __init__(self): print('enter C') super().__init__() print('leave C') class D(B, C): def __init__(self): print('enter D') super().__init__() print('leave D') D() enter D enter B enter C enter A leave A leave C leave B leave D
    5
    146
  • 爬行的蜗牛
    1. 面向对象编程的四要素是什么, 它们的关系是什么 - 抽象 - 封装 - 继承 - 多态 个人理解: -抽象的本质是抽取不同类的的相同方法(函数)和属性, 作为父类的属性和方法; - 封装就是把功能封装抽象的方法和其他属性和方法; - 子类继承父类的抽象出来的属性和方法; - 多态就是重写抽象的方法(函数)。 2. 继承是什么? 用三个字表示出来; 子类继承父类的属性和方法(函数)减少代码量和复杂度; 三个字:承接:属性&函数

    作者回复: 👍

    2
    30
  • 奔跑的蜗牛
    经典类:深度优先,F->D->B->A->E->C->H 新式类:广度优先,F->D->B->E->C->H->A class A: # def test(self): # print('from A') pass class B(A): # def test(self): # print('from B') pass class C(A): # def test(self): # print('from C') pass class D(B): # def test(self): # print('from D') pass class E(C): # def test(self): # print('from E') pass class H(A): def test(self): print('from H') pass class F(D,E,H): # def test(self): # print('from F') pass f=F() f.test() print(F.mro())

    作者回复: 👍

    3
    28
  • enjoylearning
    写的真好,立马搞清楚了Python中的面向对象和抽象类,昨天还在看abcmeta怎么用,另外我觉得最佳实践里不提倡多重继承,感觉这样是代码坏味道

    作者回复: 正解,设置这道思考题的另一个意图是,对于自己不熟悉的地方,不要想当然就用在生产线上,能用简单的思路解决问题,就不要用自己不熟悉的复杂的特性。

    7
  • 单色
    问题1: 封装,继承,多态,抽象 封装使得代码更加模块化,代码复用度更高 继承使得子类不仅拥有自己的属性和方法,还能使用父类的属性和方法 多态可以实现函数重写,使得相同方法具有不同功能 抽象不同子类的相同方法和属性形成父类,在通过继承,多态,封装使得代码更加紧凑,简洁易读 问题2: 父与子 思考题: 旧式类(经典类):深度优先 新式类:广度优先

    作者回复: 👍

    6
  • Paul Shan
    类是对象的集合 问题1 面向对象四要素是,封装,抽象,继承,多态。封装是区分类内和类外的信息。抽象是区分接口和实现的信息,继承是一个类拓展其他类。多态是,一个接口多个实现。封装是基础。抽象和多态有赖于继承实现。 问题2 继承 -- 类生子 思考题 多重继承,同一个超类会被构建多次。

    作者回复: 👍

    6
  • 自主
    老师:我一直有个疑问,我查了一些答案讲得都不是很清楚,我想知道类中self参数的设计思想是什么?

    作者回复: 简单的说是为了调用类成员和成员函数。

    3
  • Lone
    文中的重载是不是都应该改为重写

    作者回复: 说的对,英语用 override 应该翻译成重写,而 overload 对应于中文的重载,在 python 中并不提供原生支持

    2
  • GentleCP
    老师,对于类函数还是不太懂,一般在什么情况下才需要对类函数进行定义呢

    作者回复: 正如文中所说,类函数最常见的用法在于提供不同的构造函数:类函数可以显式被外界调用,第一个参数 cls 表示类本身,因此可以使用 cls 调用类本身的构造函数来完成初始化。

    2
  • 卢三
    写代码用什么IDE呢,jupyter没有代码补全啊

    作者回复: 大型工程可以用pycharm,jupyter适合小型得程序

    2
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部