第1关:初识继承
任务描述
在面向对象编程中,有一种机制叫做继承。通过继承,子类可以继承其父类所有的属性和方法,这在很大程度上增强了代码的重用。以下场景便模拟了继承的现实场景:在自然界中存在着许多的动物,动物间有许多的共性。比如:呼吸、奔跑、觅食等,但是它们之间也存在着不同之处,比如鱼会游泳、豹子会爬树……
在上面这个场景里,动物就是父类,它具有着所有动物都有的共性,而鱼和豹子是子类,它们不仅具有共性:呼吸、奔跑、觅食,还有着自己独特的特征:游泳、爬树。本关的任务是让学习者掌握 Python 中类的继承机制。
####相关知识
#####父类
父类也称基类,其声明方法与一般的类的声明方法一样。父类中存在着一些公共的属性和方法,子类继承于父类。
#####子类
子类继承于父类,拥有父类中的属性和方法,它自己也可根据实际情况声明一些属于自己的属性和方法。子类声明方法:

class subClass(parentClass1,parentClass2,parentClass3,……):class_suite

类名后的括号里填的就是所继承的父类的名称。例如:

class ParentClass:static_var = 100def parentMethod(self):print("这是父类")
class SubClass(ParentClass):def subMethod(self):print("这是子类")
sc = SubClass()
print(sc.static_var)
sc.parentMethod()
sc.subMethod()
print("%s所属的父类为%s" %(sc.__class__,SubClass.__bases__))

输出结果为:
100
这是父类
这是子类
<class ‘main.SubClass’>所属的父类为(<class ‘main.ParentClass’>,)
对于任何子类来说,__bases__类是一个包含其父类的集合的元组,对于没有父类的类来说,其__bases__属性值为空。
如果您想了解更多继承的相关知识,请参考:[美] Wesley J.Chun 著《 Python 核心编程》第十三章。
编程要求
本关的测试文件中定义了一个父类animals类,在此类中定义了三个方法,分别为:breath()、run()、foraging()。而在通关文件中,定义了两个类:fish与leopard,这两个类都继承自animals类。
本关的编程任务是补全animals.py文件中的定义子类部分,具体要求如下:
填入定义继承自animals类的fish类的代码;
填入定义继承自animals类的leopard类的代码。
本关涉及的代码文件src/Step1/animals.py的代码框架如下:

import animalstest
# 请在下面填入定义fish类的代码,fish类继承自animals类
########## Begin ##########
########## End ##########def __init__(self,name):self.name = namedef swim(self):print("%s会游泳" %self.name)
# 请在下面填入定义leopard类的代码,leopard类继承自animals类
########## Begin ##########
########## End ##########def __init__(self,name):self.name = namedef climb(self):print("%s会爬树" %self.name)
fName = input()
f = fish(fName)
f.breath()
f.swim()
f.foraging()
lName = input()
l = leopard(lName)
l.breath()
l.run()
l.foraging()

测试说明
本文的测试文件是animalstest.py,具体测试过程如下:
平台自动编译生成animalstest.exe;
平台运行animalstest.exe,并以标准输入方式提供测试输入;
平台获取animalstest.exe输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。
以下是平台对src/step1/animalstest.py的样例测试集:
预期输入:

豹子
预期输出:
鱼会呼吸
鱼会游泳
鱼会觅食
豹子会呼吸
豹子会奔跑
豹子会觅食
预期输入:


预期输出:
虾会呼吸
虾会游泳
虾会觅食
猫会呼吸
猫会奔跑
猫会觅食
开始你的任务吧,祝你成功!
成功不是战胜敌人,而是提高自己。我们只要每天进步百分之一,那就是成功。
参考代码:

import animalstest
# 请在下面填入定义fish类的代码,fish类继承自animals类
########## Begin ##########
class fish(animalstest.animals):
########## End ##########def __init__(self,name):self.name = namedef swim(self):print("%s会游泳" %self.name)# 请在下面填入定义leopard类的代码,leopard类继承自animals类
########## Begin ##########
class leopard(animalstest.animals):
########## End ##########def __init__(self,name):self.name = namedef climb(self):print("%s会爬树" %self.name)fName = input()
lName = input()
f = fish(fName)
f.breath()
f.swim()
f.foraging()
l = leopard(lName)
l.breath()
l.run()
l.foraging()

第2关:覆盖方法
任务描述
在子类继承父类的方法时,若子类需要这个方法具有不同的功能,那么可以通过覆盖(overriding)来重写这个方法。本关的任务是让学习者掌握通过继承覆盖方法。
####相关知识
通过继承覆盖方法,也就是在子类里再写一个与父类中一样的方法,实现自己想要实现的功能。例如:

class Parent:def sayHello(self):print("hello,i am class parent")
class Subclass(Parent):def sayHello(self):print("hello,i am class subclass")
sc = Subclass()
sc.sayHello()

结果为:
hello,i am class subclass
Subclass继承了Parent类,但是因为它在类中重写了sayHello(),所以在创建实例后,调用的是重写后的sayHello()。
调用父类方法
在重写了父类中的方法后,也可以调用父类中的被重写方法。这时就是去调用一个未绑定的父类方法。例如:
Parent.sayHello(sc)
结果为:
hello,i am class parent
还可以在子类的重写方法里显示调用。例如:

class Parent:def sayHello(self):print("hello,i am class parent")
class Subclass(Parent):def sayHello(self):Parent.sayHello(self)print("hello,i am class subclass")
sc = Subclass()
sc.sayHello()

结果为:
hello,i am class parent
hello,i am class subclass
但是最好的方法是在子类的重写方法里使用super()内建方法。例如:

class Parent:def sayHello(self):print("hello,i am class parent")
class Subclass(Parent):def sayHello(self):super(Subclass,self).sayHello()print("hello,i am class subclass")
sc = Subclass()
sc.sayHello()

结果为:
hello,i am class parent
hello,i am class subclass
如果您想了解更多覆盖方法的相关知识,请参考:[美] Wesley J.Chun 著《 Python 核心编程》第十三章。
编程要求
本关的任务是补全Point.py文件中的代码,具体要求如下:
填入覆盖父类getPoint()方法的代码,并在这个方法中分别得出x - y与z - h结果的绝对值。
本关涉及的代码文件src/Step2/Point.py的代码框架如下:

class point:def __init__(self,x,y,z,h):self.x = xself.y = yself.z = zself.h = hdef getPoint(self):return self.x,self.y,self.z,self.h
class line(point):# 请在下面填入覆盖父类getPoint()方法的代码,并在这个方法中分别得出x - y与z - h结果的绝对值########## Begin #################### End ##########print(length_one,length_two)

测试说明
本文的测试文件是Pointtest.py,具体测试过程如下:
平台自动编译生成Point.exe;
平台运行Point.exe,并以标准输入方式提供测试输入;
平台获取Point.exe输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。
以下是平台对src/step2/Point.py的样例测试集:
预期输入:
12
41
6
0
预期输出:
29
6
预期输入:
2
90
65
10
预期输出:
88
55
开始你的任务吧,祝你成功!
这世间,唯有青春和梦想不可辜负。花开正好,微风不燥,扬帆起航,追逐梦想。
参考代码:

class Point:def __init__(self,x,y,z,h):self.x = xself.y = yself.z = zself.h = hdef getPoint(self):return self.x,self.y,self.z,self.h
class Line(Point):# 请在下面填入覆盖父类getPoint()方法的代码,并在这个方法中分别得出x - y与z - h结果的绝对值########## Begin ##########def getPoint(self):length_one=abs(self.x-self.y)length_two=abs(self.z-self.h)########## End ##########print(length_one,length_two)

第3关:从标准类派生
任务描述
在 Python 中有6种标准数据类型,分别为:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Sets(集合)和Dict(字典)。而根据内存中的内容是否可变,分为可变类型与不可变类型。其中,数字、字符串、元组和集合被称为不可变类型,列表和字典称为可变类型。
对标准类型的子类化是一个很重要的知识点,本关的任务就是要让学习者掌握标准类型子类化的方法。
相关知识
不可变类型子类化
假定我们需要处理大量的浮点数,将浮点数四舍五入后得到最后的结果。这时我们可以定义这样一个类,用来进行这个操作。例如:
class RoundFloat(float):
def new(cls, val):
return float.new(cls,round(val,1))
print(RoundFloat(2.6557))
结果为:
2.7
在这个类里面,通过调用父类的构造器来创建对象,然后实例化float、RoundFloat。这里我们仅仅是从一种类型中派生而来,我们可以使用super()内建函数去捕获对应的父类,然后调用父类的__new__()方法进行实例化。例如:
class RoundFloat(float):
def new(cls, val):
return super(RoundFloat,cls).new(cls,round(val,1))
print(RoundFloat(2.6557))
结果为:
2.7
可变类型子类化
子类化一个可变类型与子类化不可变类型很类似,但是我们可能不需要使用__new__()或者是__init__(),因为一般情况下我们定义的类所继承到的类型的默认行为就足够我们用了。例如:
class SortedKeyDict(dict):
def keys(self):
return sorted(super( SortedKeyDict, self).keys())
d = SortedKeyDict(((‘zhangsan’, 1), (‘lisi’, 2),(‘wangwu’, 3)))
print(“By iterator:”.ljust(12), [key for key in d])
print(“By keys():”.ljust(12), d.keys())
结果为:
By iterator: [‘zhangsan’, ‘lisi’, ‘wangwu’]
By keys(): [‘lisi’, ‘wangwu’, ‘zhangsan’]
如果您想了解更多标准类型子类化的相关知识,请参考:[美] Wesley J.Chun 著《 Python 核心编程》第十三章。
编程要求
本关的编程任务是补全ChangeAbs.py文件中的代码,具体要求如下:
使用super()内建函数去捕获对应的父类,并调用它的__new__()方法来计算输入数值的绝对值,返回最后的结果;
使用super()内建函数去捕获对应父类,从而使输入字典自动排序并返回最后的结果。
本关涉及的代码文件src/Step3/ChangeAbs.py的代码框架如下:

class ChangeAbs(int):def __new__(cls, val):# 使用super()内建函数去捕获对应父类,以调用它的__new__()方法来计算输入数值的绝对值# 求一个数的绝对值的函数为abs()# 返回最后的结果########## Begin #################### End ##########
class SortedKeyDict(dict):def keys(self):# 使用super()内建函数去捕获对应父类使输入字典自动排序# 返回最后的结果########## Begin #################### End ##########

测试说明
本文的测试文件是ChangeAbstest.py,具体测试过程如下:
平台自动编译生成ChangeAbstest.exe;
平台运行ChangeAbstest.exe,并以标准输入方式提供测试输入;
平台获取ChangeAbstest.exe输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。
以下是平台对src/step3/ChangeAbstest.py的样例测试集:
预期输入:
-6
zhangsan
12
lisi
23
wangwu
56
预期输出:
6
[‘lisi’, ‘wangwu’, ‘zhangsan’]
预期输入:
0
jim
0
jane
76
bob
2
预期输出:
0
[‘bob’, ‘jane’, ‘jim’]
开始你的任务吧,祝你成功!
参考代码:

class ChangeAbs(int):def __new__(cls, val):# 填入使用super()内建函数去捕获对应父类以调用它的__new__()方法来计算输入数值的绝对值的代码# 求一个数的绝对值的函数为abs()# 返回最后的结果########## Begin ##########return super(ChangeAbs,cls).__new__(cls,abs(val))########## End ##########
class SortedKeyDict(dict):def keys(self):# 填入使用super()内建函数去捕获对应父类使输入字典自动排序的代码# 返回最后的结果########## Begin ##########return sorted(super(SortedKeyDict,self).keys())########## End ##########

第4关:多重继承
任务描述
在 Python 中,多重继承就是允许子类继承多个父类,子类可以调用多个父类的方法和属性。但是,当多个父类拥有相同方法名的方法时,我们通过方法名调用父类方法就有一定的顺序。本关的任务就是让学习者掌握多重继承。
相关知识
请先看下面这个例子:

class A(object):def test(self):print("this is A.test()")
class B(object):def test(self):print("this is B.test()")def check(self):print("this is B.check()")
class C(A,B):pass
class D(A,B):def check(self):print("this is D.check()")
class E(C,D):pass

在这个例子中,类C继承自类A和类B,类D继承自类A和类B,类E继承自类C和类D。继承情况如下图1所示:

在我们调用E.test()时,在类A和类B中都存在这个方法。但是由于在多重继承中遵循广度优先的方式,所以程序最先搜索类E,然后再搜索类C和类D。如果还没找到,再到类A中查找。若类A中存在这个方法,则调用这个方法,若在类A中也没有找到,则再到类B中查找。调用E.test()结果为:
this is A.test()
如果调用E.check()方法,那么先到类E中查找,然后在类C中查找,再到类D中查找。在类D中找到这个方法,调用这个方法。调用E.check()的结果为:
this is D.check()
如果您想了解更多多重继承的相关知识,请参考:[美] Wesley J.Chun 著《 Python 核心编程》第十三章。
编程要求
本关的编程任务是补全src/Step4/multiInherit.py文件的代码,实现当调用类E的test()时,继承的是类A的test()。具体要求如下:
填入定义子类C的代码;
填入定义子类D的代码。
本关涉及的代码文件src/Step4/multiInherit.py的代码框架如下:

class A(object):def test(self):print("this is A.test()")
class B(object):def test(self):print("this is B.test()")def check(self):print("this is B.check()")
# 请在下面填入定义类C的代码
########## Begin ##########
########## End ##########pass
# 请在下面填入定义类D的代码
########## Begin ##########
########## End ##########def check(self):print("this is D.check()")
class E(C,D):pass
e = E()
e.test()

测试说明
本关中填入代码后直接运行程序,按照运行结果判断正误,无需测试文件。以下是平台对src/Step4/multiInherit.py的样例测试集:
预期输出:
this is A.test()
开始你的任务吧,祝你成功!
掌握专业知识是创富的基础,没有这个基础,或是这个基础打得不够坚实,接下去的路你将寸步难行。创富者首先要做的便是成为这个行业的专家。
参考代码:


class A(object):def test(self):print("this is A.test()")
class B(object):def test(self):print("this is B.test()")def check(self):print("this is B.check()")
# 请在下面填入定义类C的代码
########## Begin ##########
class C(A,B):
########## End ##########pass
# 请在下面填入定义类D的代码
########## Begin ##########
class D(A,B):
########## End ##########def check(self):print("this is D.check()")
class E(C,D):pass

Python 入门之类的继承相关推荐

  1. Python入门之类的继承

    第1关:初识继承 本关的测试文件中定义了一个父类animals类,在此类中定义了三个方法,分别为:breath().run().foraging().而在通关文件中,定义了两个类:fish与leopa ...

  2. 小白量化投资交易入门课(python入门金融分析)

    推荐一门课程:课程连接 课程名称:死工资一党课程:小白量化投资入门课(python) 课程定位:本课程为视频课程,全面覆盖量化交易基础知识点. 面向人群:股票基础较弱者.Python编程基础较弱者. ...

  3. python入门笔记——飞机大战(极简版、未进行继承优化)

    python入门笔记--飞机大战(极简版.未进行继承优化) import random import pygame# 引用pygame里的模块 from pygame.locals import *# ...

  4. python入门笔记——类和对象⑤(继承)

    python入门笔记--类和对象⑤(继承) # python中展现面向对象的三大特征:封装.继承.多态 # 封装:把内容封装到某个地方以便后续的使用 # 对封装来说,其实就是使用初始化构造方法将内容封 ...

  5. python入门教程完整版(懂中文就能学会)-Python入门教程完整版(懂中文就能学会)...

    不过小编的内心是强大的,网友虐我千百遍,我待网友如初恋,因为今天又给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习, ...

  6. python入门教程完整版(懂中文就能学会)-Python入门教程完整版400集(懂中文就能学会)快来带走...

    为了感谢大家的关注与支持, 小编今天给大家分享一套高老师的python400集视频教程,里面包含入门进阶,源码,实战项目等等,,不管你是正在学习中,还是想要学习的,通通来吧 肯定不会让你失望.活动仅限 ...

  7. python入门到精通需要学多久-史上最详细python学习路线-从入门到精通,只需5个月时间...

    针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...

  8. python入门只需20分钟-史上最详细python学习路线-从入门到精通,只需5个月时间...

    针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...

  9. python编程在哪里写-python入门该从哪里开始?

    相信对于每个人而言,知道编程和学习编程这件事,出发点是不同的.汤哥在北京接触编程的时间是2013年,那个时候还在一个二线城市上大学,还没有这么多各种融资,各种互联网创业的氛围,大家想的更多的是一些线下 ...

最新文章

  1. linux 服务器 iptables 防止arp病毒,Linux下防御ARP病毒攻击
  2. mybatis修改mysql变量_Java通过MyBatis框架对MySQL数据进行增删查改的基本方法
  3. 男生报计算机专业前景,我是一名读文科的高三男生,将来想报计算机专业,请问可行吗?...
  4. Wiener Filter维纳滤波器halcon算子,持续更新
  5. Nat Genet | 杨俊/岳峰团队合作揭示GATA3的遗传性非编码变异增加儿童急性淋巴细胞白血病风险的新机制...
  6. 自适应 响应式展示型企业通用网站源码 织梦dedecms模板
  7. Rational Rose及RequisitePro安装注意事项
  8. MTK 驱动开发(32)---Sensor 移植及调试2
  9. 人工智能是否未来可期?3本人工智能书带你优雅升级
  10. 如何获取中间层的结果_如何从0开始做大数据治理(上)
  11. 数学建模编程用c语言,C程序设计一百例--用c语言解决数学建模问题.doc
  12. css幻灯片样式,纯CSS3全屏响应式幻灯片特效
  13. C语言改变运行界面的颜色以及清屏功能
  14. xaxis python_在python中绘制xaxis中的多列值
  15. 【汇正财经】企业资本的意义
  16. 搜索技巧——奇偶剪纸
  17. html onload不起作用,body标签onLoad执行无效,为何?
  18. 基于Redis解决业务场景中延迟队列的应用实践
  19. 1313. 老曹骑士 TJ
  20. Bluetooth资格认证(BQB)学习

热门文章

  1. 机器学习算法基础(6): 信息论,决策树和随机森林
  2. 【Android校招】六家大厂一起发难
  3. 美化网页div -让边框拥有阴影,边角变得圆滑
  4. 2014年国内智能家居市场发展报告(完整版)
  5. TI/德州仪器 TS5A3157DBVR 模拟开关
  6. apt-get安装问题:请尝试不指明软件包的名字来运行“apt-get -f install”(也可以指定一个解决办法)。
  7. 经典排序算法(一) —— Selection Sort 选择排序
  8. 《光晕:斯巴达进攻》正式登陆Windows Phone及Windows 8.1平台
  9. jsp高校学生资助管理系统myeclipse开发mysql数据库serlvet技术BS模式java编程网页结构
  10. PAC (proxy auto-config) 自动代理