第7.7节 案例详解:Python类继承机制
本节实现一个类继承的小程序,下面一边结合代码一边介绍相关继承的知识。例子以车、汽车为例,车为父类、汽车为子类。
一、 定义父类Vehicle
class Vehicle():
def __init__(self,wheelcount, power):#构造方法,参数有轮子数和动力
self.wheelcount,self.power,self.totaldistance = wheelcount,power,0
#初始化行驶总里程为0
def gettotaldistance(self):return self.totaldistance #定义获取形式总里程的方法
def drive(self,distance):#定义drive方法
self.totaldistance += distance
二、 定义子类Car
class Car(Vehicle):
def __init__(self,wheelcount, power):
super().__init__(wheelcount, power)
Vehicle.__init__(self,wheelcount, power)
super(Car,self).__init__(wheelcount, power)
self.oil,self.oilcostperkm=0,0.1
子类内首先重写了构造方法,注意:
1. 首先调用了超类的构造方法,为了说明超类方法的调用,代码将三种调用超类构造方法都实现了(具体这三种方法的使用方法请参考上一节的介绍),实际上只要有一种就够了;
2. 超类构造方法中初始化了轮子数、动力以及总行驶里程。子类调用超类构造方法后,对于汽车又初始化了油量和每公里油耗。
def drive(self,distance):
realdistance=min(distance,self.oil/self.oilcostperkm)
super().drive(realdistance)
self.oil -= realdistance*self.oilcostperkm
print("车开了{}公里,目前邮箱存油{:.2f}升,目前车辆总里程:{}KM".format(realdistance,self.oil, super().gettotaldistance()))
子类重写了父类的drive方法,本次只用了一种老猿推荐的方式调用父类的drive方法,重写的方法内根据油量确认了实际驾驶里程之后调用了父类的drive方法,同时对油量进行了调整,输出了一些车况信息,其中调用了父类的gettotaldistance()方法。
def oiling(self,oil):
self.oil+=oil
print("加油{}升,目前邮箱存油{:.2f}升".format(oil,self.oil))
实现子类独有的加油方法,父类的车可以是畜力或人力等其他方式驱动就没有这个方法。
def needoiling(self):
if self.oil<5: return True
else:return False
实现子类独有的是否需要加油判断方法。
def output(self):
print("车子动力为{},100KM油耗{}升,车子累计行驶{}KM,油箱存油{:.2f}L".format(self.power,self.oilcostperkm*100, super().gettotaldistance(),self.oil))
实现子类独有的输出车况的方法,其中调用了父类的gettotaldistance()方法。
到此为止整个子类的代码实现完成,它完全继承了父类方法gettotaldistance,采用重写+父类调用方式实现了drive和构造方法的继承,并实现了needoiling、oiling两个子类独有的方法,其实例变量self.wheelcount,self.power,self.totaldistance是从父类继承。
三、 调用的代码
下面是使用该类定义的一个实例,
car = Car(4,'汽油发动机')
car.oiling(50)
for i in range(1,100):
print("***************第{}次循环************".format(i))
car.oiling(random.randint(10,60)) #随机加油x升
car.drive(random.randint(5,1000)) #随机驾驶x公里
car.output() #输出车况信息
if car.needoiling(): break #如果油不够了就结束循环
四、 上述例子的完整源代码
#coding:utf-8
import random
class Vehicle():
def __init__(self,wheelcount, power):
self.wheelcount,self.power,self.totaldistance = wheelcount,power,0
def drive(self,distance):
self.totaldistance += distance
def gettotaldistance(self):return self.totaldistance
class Car(Vehicle):
def __init__(self,wheelcount, power):
super().__init__(wheelcount, power)
Vehicle.__init__(self,wheelcount, power)
super(Car,self).__init__(wheelcount, power)
self.totaldistance,self.oil,self.oilcostperkm=0,0,0.1
def drive(self,distance):
realdistance=min(distance,self.oil/self.oilcostperkm)
super().drive(realdistance)
self.oil -= realdistance*self.oilcostperkm
print("车开了{}公里,目前邮箱存油{:.2f}升,目前车辆总里程:{}KM".format(realdistance,self.oil,super().gettotaldistance()))
def oiling(self,oil):
self.oil+=oil
print("加油{}升,目前邮箱存油{:.2f}升".format(oil,self.oil))
def needoiling(self):
if self.oil<5: return True
else:return False
def output(self):
print("车子动力为{},100KM油耗{:.2f}升,车子累计行驶{}KM,油箱存油{:.2f}L".format(self.power,self.oilcostperkm*100,super().gettotaldistance(),self.oil))
car = Car(4,'汽油发动机')
car.oiling(50)
for i in range(1,100):
print("***************第{}次循环************".format(i))
car.oiling(random.randint(10,60))
car.drive(random.randint(5,1000))
car.output()
if car.needoiling(): break
本节结合上节的知识通过一个例子介绍了类继承的使用方法,大家可以结合上节的知识理解相关实现代码。由于相关代码中使用了随机数,因此每次运行结果都可能不同,下面是其中某次运行的截图:
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
第7.7节 案例详解:Python类继承机制的更多相关文章
- 第7.20节 案例详解:Python抽象类之真实子类
第7.20节 案例详解:Python抽象类之真实子类 上节介绍了Python抽象基类相关概念,并介绍了抽象基类实现真实子类的步骤和语法,本节结合一个案例进一步详细介绍. 一. 案例说明 本节定义 ...
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- 第7.16节 案例详解:Python中classmethod定义的类方法
第7.16节 案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一. 案例说明 本节定义的一个 ...
- 第7.13节 案例详解:Python类变量
第7.13节 案例详解:Python类变量 上节介绍了类变量的定义和使用方法,并举例进行了说明.本节将通过一个更完整的例子来说明. 一. 定义函数dirp def dirp(iter): ret ...
- 第7.9节 案例详解:Python类封装
上节介绍了Python中类的封装机制,本节结合一个具体例子进行详细说明. 我们定义一个Person类,其内部有姓名.年龄和类型三个实例变量,并定义了相关的存取方法: class Person(): ...
- 第7.11节 案例详解:Python类实例变量
上节老猿介绍了实例变量的访问方法,本节结合一个具体案例详细介绍实例变量访问. 本节定义一个Vehicle类(车),它有三个实例变量self.wheelcount(轮子数).self.power(动力) ...
- 详解python之反射机制
一.前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = 1 t ...
- 详解Python垃圾回收机制
http://www.qytang.com/cn/list/28/417.htmhttp://www.qytang.com/cn/list/28/416.htmhttp://ww 引用计数 Pytho ...
- 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一. 案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...
随机推荐
- Java中的日期
Date类(java.util.Date) 时间原点:1970年1月1日 8点0分0秒. 创建日期对象: package blog; import java.util.Date; public cla ...
- Doctrine\ORM\QueryBuilder 源码解析之 where
背景 最近有需求实现类似于 QueryBuilder 的谓词语句,就去翻看了它的源码.先看两个例子 例子1 $qb = $em->createQueryBuilder(); $qb->se ...
- 我画着图,FluentAPI 她自己就生成了
在 Newbe.ObjectVistor 0.3 版本中我们非常兴奋的引入了一个紧张刺激的新特性:使用状态图来生成任意给定的 FluentAPI 设计. 开篇摘要 在非常多优秀的框架中都存在一部分 F ...
- 没有真实串口设备时使用"虚拟串口驱动"调试你的串口代码
目录 前言 示例代码 总结 前言 很多时候需要编写串口代码,但是又没有真实串口设备来调试代码.以及本身就是要操作2个串口的情况,可以使用"虚拟串口驱动"工具方便的调试代码. 使用方 ...
- 01 Servlet技术
Servlet 1.Servlet技术 1.1.什么是Servlet Servlet是JavaEE规范之一.规范就是接口 Servlet就JavaWeb三大组件之一.三大组件分别是:Servlet程序 ...
- 利用s3-test进行ceph的接口兼容性测试
前言 ceph的rgw能够提供一个兼容性的s3的接口,既然是兼容性,当然不可能是所有接口都会兼容,那么我们需要有一个工具来进行接口的验证以及测试,这个在其他测试工具里面有类似的posix接口验证工具, ...
- MFC的消息响应机制说明
MFC的快速理解: 1.MFC的设计者们在设计MFC时,有一个主要的方向就是尽可能使得MFC的代码要小,速度尽可能快.为了这个方向,工程师们使用了许多技巧,主要表现在宏的运用上,实 现MFC的消息映射 ...
- 原生sql查询返回结果集处理方法
今天博主用原生写查询的时候发现,查询出来的居然不是我数据表里的数据,而是一个对象 object(mysqli_result)#2 (5) { ["current_field"]=& ...
- 了解 MySQL的数据行、行溢出机制吗?
目录 一.行 有哪些格式? 二.紧凑的行格式长啥样? 三.MySQL单行能存多大体量的数据? 四.Compact格式是如何做到紧凑的? 五.什么是行溢出? 六.行 如何溢出? 七.思考一个问题 关注送 ...
- 使用CleanMyMac快速管理应用程序 优化Mac
CleanMyMac作为一款专业的苹果电脑清理软件,它不仅仅能单纯的卸载不用.少用的应用,同时还支持:1.清理应用程序的数据文件,将应用重置回初始状态,减少空间占用:2.自动检查应用更新,保持应用的最 ...