2020-07-31 类的定制和类的继承

这两个知识点属于类中较高阶的操作,让用类写成的代码更容易复用、拓展和维护。

可以这么说:能成为面向对象编程的主要工具,帮助Python在编程世界打下一片疆土,很大程度上是基于它的继承和定制

此处不会讲得太过艰深,有个基本的了解便足够,等遇到了实际项目需求再深入研究,这样的效率会更高。

【类的继承和定制是什么?】

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

在Python中,我们的习惯表述是:A类是B类的子类,而B类是A类的父类(或超类)

所以,类的继承,让子类拥有了父类拥有的所有属性和方法。如此,不用白手起家(从头写代码),直接一夜暴富(代码的复用)。

子类可以在继承的基础上进行个性化的定制,包括:(1)创建新属性、新方法;(2)修改继承到的属性或方法。

简而言之:类的定制,不仅可以让子类拥有新的功能,还能让它有权修改继承到的代码。

所以,当我们谈定制时,已经包含了继承。毕竟,类的定制的前提是继承,而定制的加入让类的继承不仅仅只是单纯的复制而已。

【类的继承,要怎么写?】

【继承的基础语法】

而子类继承的属性和方法,也会传递给子类创建的实例

实例yewen(叶问)是Cantonese(广东人)这个类创建的实例,却拥有Chinese才有的属性和方法。

不过,很多在创建时也不带括号,如class Chinese:。这意味着它们没有父类吗?

并不。实际上,class Chinese:在运行时相当于class Chinese(object):。而object,是所有类的父类,我们将其称为根类(可理解为类的始祖)。

我们可以用一个函数来验证这一点:函数isinstance(),可以用来判断某个实例是否属于某个类

具体用法是输入两个参数(第一个是实例,第二个是类组成的元组),输出是布尔值(True 或 False)。

所以,在类的继承中,不仅子类属于父类,子类所创建的实例实际上也同时属于父类

理论上,父类可以被无限个子类所继承(这一点好比类的属性方法可以传递给无限个实例)。

【类的继承之多层继承】

继承不仅可以发生在两个层级之间(即父类-子类),还可以有父类的父类、父类的父类的父类……

结论:子类创建的实例可调用所有层级父类的属性和方法

多层继承,属于继承的深度拓展。而下面要讲的多重继承,则是继承的宽度拓展

【类的继承之多重继承】

一个类,可以同时继承多个类,语法为class A(B,C,D):。括号里的顺序是有讲究的。和子类更相关的父类会放在更左侧

子类在调用属性和方法时,会先在左侧的父类中找,找不到才会去右侧的父类找。(可理解为“就近原则”)

多层继承和多重继承的结合,让继承的拥有更多的属性和方法,且能更灵活地调用。进而,继承的力量也得以放大了很多倍。

【练习】

尝试用代码完成下面的继承关系,按照下图类名和属性创建5个类,并打印出C4类的实例的属性name和num。

可以发现就近原则中的一个细节:多重继承中,若某父类还有父类的话,会先继续往上找到顶。例如代码中的CC.name调用的是C2的父类C0的值而非 C3。

【类的定制,要怎么写?】

【定制,可以新增代码】

【定制,也可重写代码】

重写代码,是在子类中,对父类代码的修改。

举个例子:已知中国的陆地面积,也知道广东的陆地面积占比为1.88%。那么,两个类的方法可以写成这样:

不过,这个其实是不好的示范。虽然目的达成了,但直接重写并不优雅(有点类似洗去了旧方法,然后补上新方法),这样对代码的维护很不友好。

想一想:假设有34个子类需定制这个方法,都是直接重写。那么,假设父类的方法改变,如说法改为“我们脚下的大地的面积有960万平方公里”。那么,就需要将所有子类的代码中的说法也改变。

子类继承父类方法的操作是在def语句后接父类.方法(参数),如上述代码的第八、九行。

这样一来,父类方法land_area中的说法改变,子类也不用去动,因为子类直接继承了父类的方法。只不过,在继承的基础上,通过参数的调整完成了定制

参数的调整,可以增加参数(如 rate),也可以改变参数的默认值,如下:

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

【知识点回顾】

【课后练习】

练习要求:

每个人都有好几个不同的身份,且不同身份都附带一些特定的特征(属性)和行为(方法)。

例如,有这样一群人:在学校时被归在老师,脸是严肃的;亲子关系中(parenthood)则被归到父亲,脸是甜蜜的。

下面,我们就以这群人为例,探索类属性在类的继承和定制中的传递和改变。

首先,我们需要创建两个类,并为它们添加属性。

请你创建两个子类,同时继承已有的两个类(注:多重继承);

然后,在其中选个子类进行定制:将 face 属性的值改变为'gentle';

再者,创建实例 time3、time4,以调用子类的 face 属性。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,312评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,578评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,337评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,134评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,161评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,303评论 1 280
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,761评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,421评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,609评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,450评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,504评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,194评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,760评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,836评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,066评论 1 257
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,612评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,178评论 2 341