Python 类的学习2

上一关,我们知道了面向对象编程的重要性,也学习了类的基础知识(1.面向对象编程,2.类的创建和调用,3.创建类的两个关键点)


这一关,我们会拓展类的知识疆界,探索两个类的拓展玩法:类的定制和类的继承。
说是拓展,是因为这两个知识点属于类中较高阶的操作,让用类写成的代码更容易复用、拓展和维护(这些优势在了解继承和定制后,就能理解了)。

可以这么说:类能成为面向对象编程的主要工具,帮助 Python 在编程世界打下一片疆土,很大程度上是基于它的继承和定制。在基础课阶段,老师不会讲得太过艰深,你有个基本的了解便足够,等遇到了实际项目需求再深入研究,我想这样的效率会更高。

类的继承和定制是什么?继承,从广东人说起假设你有个外国朋友,刚来中国。某天,他看到“广东人”这个词,就来问你,你会怎么跟他解释?可能你会回答:广东是中国的一个地方。广东人就是中国人。他可能会复述:哦!原来就是中国人。深究的话,“广东人就是中国人”中的“就是”的确切含义是“属于”,即广东人属于中国人。

因此,中国人有的属性(如黑头发)和方法(如用筷子),广东人也都有。这么一来,用一句话“广东人是中国人”,便能让他接受多个信息:广东人有黑头发,会用筷子……这个过程相当于:把他脑子里对“中国人”这个类的所有信息都复制了一份,然后放到了“广东人”这个类下面。我们通过事物的归属关系,使信息的传递更为高效。听到“Python是一种计算机语言”,我们就知道Python可以编程;看到“云浮市在广东省”,我们就明白云浮市在中国南方……

同样的,编程世界也是如此。我们也可以用一句话,让计算机知道:A类属于B类,自然也拥有了B类的所有属性和方法。这句话在编程里就是:A类继承了B类。

在Python中,我们的习惯表述是:A类是B类的子类,而B类是A类的父类(或超类)。
所以,类的继承,让子类拥有了父类拥有的所有属性和方法。
如此,不用白手起家(从头写代码),直接一夜暴富(代码的复用)。不过,只有继承的话,子类只是父类的复制而已。那样,为什么不直接用父类,还要增加一个子类?要回答这个问题,就需要了解另一个重要的概念:类的定制。

定制,广东人又来了还是说回广东人
广东人除了继承中国人的属性方法外,还可以创造【属于自己】的属性或方法,如籍贯开头是广东省(属性)、会说广东话(方法)。甚至,广东人还可以调整继承到的属性或方法,如中国人有个属性“居住的陆地面积(单位:万平方公里)”的值为960,广东人继承后需要将这个属性的值改为17.98。上面的操作,都可以说是广东人在继承的基础上又做了定制。同样,子类也可以在继承的基础上进行个性化的定制,包括:(1)创建新属性、新方法;(2)修改继承到的属性或方法。

简而言之:类的定制,不仅可以让子类拥有新的功能,还能让它有权修改继承到的代码——在写这句话时,我仿佛看到子类化成了一个人,抬头瞟了一眼在他上方的父类,淡淡地说了一句话:以我为主,为我所用。
所以,当我们谈定制时,已经包含了继承。毕竟,类的定制的前提是继承,而定制的加入让类的继承不仅仅只是单纯的复制而已。
这也是我们创建子类的意义,也可以回答上面提到的那个问题——为什么我们不直接用父类而创建子类?因为……可以定制啊!至此,今天的两个核心概念,你已经掌握了。理论部分攻下后,我们就可以看代码了。先一起看看类的继承:类的继承,要怎么写?

继承的基础语法用代码表示继承,语句是:

而子类继承的属性和方法,也会传递给子类创建的实例。跑个代码感受一下吧(注:广东人的英文单词是 Cantonese)。

发现了吗?实例yewen(叶问)是Cantonese(广东人)这个类创建的实例,却拥有Chinese才有的属性和方法。原因你也知道,继承的呗~再看下代码的注释,加深对这一过程的了解吧。

可见:通过一个小括号,子类就能轻轻松松地拥有父类所拥有的一切。不用复制大段大段的代码,只要一个括号,就能复用整块代码。你也来试一试,为下面的父类Cat创建一个子类Ragdoll(布偶猫),并用这个子类的实例来调用父类的属性和方法。


不过,很多类在创建时也不带括号,如class Chinese:。这意味着它们没有父类吗?
并不。实际上,class Chinese:在运行时相当于class Chinese(object):。而object,是所有类的父类,我们将其称为根类(可理解为类的始祖)。
我们可以用一个函数来验证这一点:函数isinstance(),可以用来判断某个实例是否属于某个类。具体用法是输入两个参数(第一个是实例,第二个是类或类组成的元组),输出是布尔值(True 或 False)。跑下代码你就完全懂了:


父类创建的对象属不属于子类,但是子类创建的对象属于父类,并且它们创建的实列对象都属于跟类根类。

所以,在类的继承中,不仅子类属于父类,子类所创建的实例实际上也同时属于父类。理论上,父类可以被无限个子类所继承(这一点好比类的属性方法可以传递给无限个实例)。
这个点有什么现实意义吗?举个简单的例子:如果要为每个省级行政区的人各创建一个类,并添加各种属性和方法。那么,只要创建一个父类Chinese,在父类中将共同的属性和方法写好,然后34个类都可以通过类的继承得到Chinese的属性和方法,代码量可以减少十几甚至几十倍。
除此之外,继承还有两个更有趣的玩法:多层继承和多重继承。让我们见识一下吧。

继承不仅可以发生在两个层级之间(即父类-子类),还可以有父类的父类、父类的父类的父类……
这样一来,层级就出来了。只要你愿意,你可以继续拓展上面的例子,或往上(地球人),或往下(深圳人)。跑个代码体验一下:


在代码最后两行,我们看到:实例yewen可以调用父类Chinese和父类的父类Earthman中的属性。可得结论:子类创建的实例可调用所有层级父类的属性和方法。

相信你能感知到:多层继承,属于继承的深度拓展。
而下面要讲的多重继承,则是继承的宽度拓展。
类的继承之多重继承一个类,可以同时继承多个类,语法为class A(B,C,D):。

假设我们将“出生在江苏,定居在广东的人”设为一个类Yuesu,那么,它的创建语句则为class Yuesu(Yue,Su)。
class Yuesu(Yue,Su)括号里Yue和Su的顺序是有讲究的。和子类更相关的父类会放在更左侧。我认为“出生在江苏,定居在广东的人”在穿着和饮食等方面会更接近广东人,所以将 Yue 放在 Su 的左侧。

所以,广东人创建的实例在调用属性和方法时,会先在左侧的父类中找,找不到才会去右侧的父类找。(可理解为“就近原则”)

小结一下代码中体现的就近原则:越靠近子类(即越靠左)的父类,越亲近,越优先考虑。子类调用属性和方法时,会先在靠左的父类里找,找不到才往右找。

对比一下这两种有趣的继承方法:深度继承以及宽度继承

多层继承和多重继承的结合,让继承的类拥有更多的属性和方法,且能更灵活地调用。进而,继承的力量也得以放大了很多倍。现在,请你尝试用代码完成下面的继承关系,按照下图类名和属性创建5个类,并打印出C4类的实例的属性name和num。


可见:我们可以在子类下新建属性或方法,让子类可以用上父类所没有的属性或方法。这种操作,属于定制中的一种:新增代码。

我们直接运行一下:

除了新增代码外,定制还有另一种操作:重写代码。定制,也可重写代码。重写代码,是在子类中,对父类代码的修改。
我们举个例子:已知中国的陆地面积,也知道广东的陆地面积占比为1.88%。那么,两个类的方法可以写成这样:

这样的话,两个类都有个各自的land_area()方法,我们分别创建实例,运行一下看下结果:

不过,这个其实是不好的示范。虽然目的达成了,但直接重写并不优雅(有点类似洗去了旧方法,然后补上新方法)。想一想:假设有34个子类需定制这个方法,都是直接重写。那么,假设父类的方法改变,如说法改为“我们脚下的大地的面积有960万平方公里”。那么,就需要将所有子类的代码中的说法也改变。

虽然,这样对代码的维护很不友好。所以,下面介绍更优雅的重写方式:

子类继承父类方法的操作是在def语句后接父类.方法(参数),如上述代码的第八、九行。这样一来,父类方法land_area中的说法改变,子类也不用去动,因为子类直接继承了父类的方法。只不过,在继承的基础上,通过参数的调整完成了定制。而参数的调整,可以增加参数(如 rate),也可以改变参数的默认值,如下:

下面,请你通过参数默认值的改变,完成子类的定制,让程序的运行结果为“雷猴!欢迎来到广东。”


注意,在子类里面。通过父类的属性进行修改时,比如12和13行,12行对greet()属性进行修改,13行还需要将父类的属性再次进行调用。

这便是定制:在复用代码的基础上,又能满足个性化的需求。类的继承和定制,从某个角度来看,和人类的科技史很像:每一代人,都“继承”了上一代的科技,同时“定制”属于这一代的科技。于是,科技的发展越来越先进。可以说:我们今天所享受到科技的便利和乐趣,来源于一代又一代的人在科技上的传承和创新。在我眼前,仿佛在这样一幅画面:每一代人都站在了上一代人的肩膀上,于是,人类这个整体得以站得越高,看得越远。而我,也很愿意用自己的肩膀为你铺路,让你可以了解编程,认识编程,甚至爱上编程。我在写每堂课时,也都怀揣着这样的目标:让认真上课的你,起码在知识层面上可以更上一层楼,并且进入某个知识房间的门。这样,假设未来需要用到这房间内的知识,你也有基础去自学。对于类,至此,我敢说:你已经入门了。之后,在写代码时,只要你判断用类可以更好地满足代码需求,就大胆地用起来吧!不知道你有没有发现一个小遗憾:这两关的代码案例都是为了讲解知识而构建的,实用性不高,或者说几乎没有。

风变Python编程13类的学习2相关推荐

  1. python 编程_类的学习笔记(from刘金玉b站教程)

    一.类的定义 在面向对象里面,对象和类是不同的,对象是特定类的一个实例,比如如果车是一个类的话,某个人的一辆奔驰车就是一个对象,它是车这个类的实例. 类是抽象的,而对象是具体的.方法是定义在对象上的操 ...

  2. 风变Python之旅4---字典列表的学习

    哈哈,在开始记录今天的学习记录之前,我需要先表扬一下我自己,没想到我能坚持这么久的来学习这次的风变Python编程课,我是不是很棒,很厉害呀,嘻嘻,我会继续学下去. 在编程的世界里,计算机有3种方式利 ...

  3. python爬取拼多多爆款数据_利用风变Python快速爬取海量数据,写出10万+爆文

    我是从事自媒体内容创作者,每天都用心创作,保证文章质量,然后希望能出爆文,但似乎事情没有那么简单--自己认为可以的内容和标题但推送出去后,展示量和阅读量都低得可怜,心想,每次都这么用心,但结果却这样, ...

  4. 风变python小课 基础语法12 作业1_菜鸟的风变编程Python小课之路,这么学编程也可以?...

    原标题:菜鸟的风变编程Python小课之路,这么学编程也可以? 作为职场菜鸟,我感觉我就是现实生活里的孙弈秋,虽然学历没有他那么惨,但是在公司总感觉不那么受待见,可能因为我们这个行业本身竞争大吧,领导 ...

  5. python编程视频-【科研资源03】最全Python编程全套系统视频学习教程

    原标题:[科研资源03]最全Python编程全套系统视频学习教程 01 资源介绍 从事Python开发这么久,也了解了不少,我发现Python主要有以下四大主要应用:网络爬虫.web开发.人工智能.自 ...

  6. python编程教学视频-【科研资源03】最全Python编程全套系统视频学习教程

    原标题:[科研资源03]最全Python编程全套系统视频学习教程 01 资源介绍 从事Python开发这么久,也了解了不少,我发现Python主要有以下四大主要应用:网络爬虫.web开发.人工智能.自 ...

  7. python自学平台-Python编程和人工智能平台学习

    <Python编程和人工智能平台学习>教学大纲 课程编号:AI006001 课程名称:Python编程和人工智能平台学习 英文名称:Pythonprogramming and an int ...

  8. 零基础新手自学Python编程教程入门精通学习资料网站大全

    零基础新手自学Python编程教程入门精通学习资料网站大全 今天说下关于Python的一些普及知识,以及学习资料,这一节我来跟大家分享下. 1 为什么要学习Python? 1 Python是一个脚本语 ...

  9. 风变python基础语法_风变编程python (基础语法爬虫精进)

    温馨提示:本信息由[会员:crm010com]搜集整理发布,版权归原作者及发布者所有,您如有异议请 举报 或者 版权申诉. 风变编程python (基础语法爬虫精进) 第1章介绍在计算机中安装Pyth ...

最新文章

  1. 【Qt】新安装的虚拟机,使用QtCreator第一次编译时报错:g++: Command not found
  2. tensorflow教程 一元线性回归
  3. Android开发--详解SharedPreference/PreferenceActivity
  4. [教程]发一个iPhone收发邮件设置(163、126邮箱)
  5. vue生成静态js文件_如何立即使用Vue.js生成静态网站
  6. SSM:Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束的解决
  7. python基础 day1 var、 if、while、for、with as、open用法
  8. Android 5.0新控件——TextInputLayout
  9. 【优化求解】基于matlab罚函数的粒子群算法函数寻优【含Matlab源码 216期】
  10. bootstrap collapse 卡顿
  11. 国内最著名的公用CDN BootCDN停止服务
  12. 一个 SAP 开发工程师的 2022 年终总结:四十不惑
  13. L1正则化、L2正则化的多角度分析和概率角度的解释
  14. 先卸载 nvidia-387.26驱动,再安装nvidia-384.81 驱动
  15. COM(Componet Object Model_组件对象模型)技术概述
  16. Transformer基础
  17. IBM Power6、7配件FC号描述翻译(unix360.part06)
  18. matlab怎么做var,如何使用vgxvarx在matlab中运行这个简单的VAR(VARX?)模型?
  19. java-php-python-ssm政府机关门禁管理系统计算机毕业设计
  20. windows环境php安装imagick扩展

热门文章

  1. 服务器 'server_1' 上的 MSDTC 不可用
  2. C++ 命名空间三种用法
  3. 深度学习自学(十四):人脸检测-出现cudaGetDeviceCount failed
  4. Ubuntu 20.04配置FTP服务方法(非匿名登录)
  5. oracle没有正常启动,Oracledbstart无法正常启动处理办法
  6. 阿里python400集_自学成才的阿里大牛整理的400集自用Python视频资料,万物皆可爬...
  7. 如何让你的Linux云服务器更加的安全?
  8. 图文上下切换代码_Java核心知识 多线程并发 线程上下文切换(二十一)
  9. 《机器学习》二刷超详细笔记| 第一章 绪论
  10. 为什么属龙的有二婚命_为什么属龙的有二婚命 一生婚姻运势详解