本节实现一个类继承的小程序,下面一边结合代码一边介绍相关继承的知识。例子以车、汽车为例,车为父类、汽车为子类。

一、    定义父类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类继承机制的更多相关文章

  1. 第7.20节 案例详解:Python抽象类之真实子类

    第7.20节 案例详解:Python抽象类之真实子类 上节介绍了Python抽象基类相关概念,并介绍了抽象基类实现真实子类的步骤和语法,本节结合一个案例进一步详细介绍. 一.    案例说明 本节定义 ...

  2. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  3. 第7.16节 案例详解:Python中classmethod定义的类方法

    第7.16节  案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一.    案例说明 本节定义的一个 ...

  4. 第7.13节 案例详解:Python类变量

    第7.13节 案例详解:Python类变量 上节介绍了类变量的定义和使用方法,并举例进行了说明.本节将通过一个更完整的例子来说明. 一.    定义函数dirp def dirp(iter): ret ...

  5. 第7.9节 案例详解:Python类封装

    上节介绍了Python中类的封装机制,本节结合一个具体例子进行详细说明. 我们定义一个Person类,其内部有姓名.年龄和类型三个实例变量,并定义了相关的存取方法: class Person():   ...

  6. 第7.11节 案例详解:Python类实例变量

    上节老猿介绍了实例变量的访问方法,本节结合一个具体案例详细介绍实例变量访问. 本节定义一个Vehicle类(车),它有三个实例变量self.wheelcount(轮子数).self.power(动力) ...

  7. 详解python之反射机制

    一.前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = 1 t ...

  8. 详解Python垃圾回收机制

    http://www.qytang.com/cn/list/28/417.htmhttp://www.qytang.com/cn/list/28/416.htmhttp://ww 引用计数 Pytho ...

  9. 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

随机推荐

  1. 17 c10k问题

    所谓c10k问题,指的是服务器同时支持成千上万个客户端的问题,也就是concurrent 10 000 connection(这也是c10k这个名字的由来). 推荐: https://my.oschi ...

  2. php 正则金额验证

    $money_reg = '/^[1-9]\d*|^[1-9]\d*.\d+[1-9]$/';if(!preg_match($money_reg, $money)){ $this->ajaxEr ...

  3. 手动实现简单的tomcat服务器

    手动实现tomcat服务器的流程: 分析具体的实现步骤: 1,浏览器和后端服务如何实现通信,首先传输的数据要遵循http协议,通过tcp也就是我们常说的套接字编程来实现,具体的底层数据传输肯定就是我们 ...

  4. Moment.js的常见用法

    Moment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率.通常是用来获取时间,设置时间,格式化时间,比较时间等操作.  1.获取时间       St ...

  5. tcp 拥塞控制引擎&状态机

    TCP核心:流量控制   拥塞控制 流量控制:滑动窗口来实现, 防止接收方能够处理过来 拥塞控制:防止过多的包被发送到网络中,避免出现网络负载过大 说一说 拥塞控制: 拥塞控制状态机的状态有五种,分别 ...

  6. 主动关闭 time-wait 2msl 处理

    先上传后面整理 /* * This routine is called by the ICMP module when it gets some * sort of error condition. ...

  7. WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

    如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的. 今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDi ...

  8. MySQL 5.x乱码问题解决

    MySQL是一款常用的开源数据库软件,但是对于初次使用者好像并不是太友好,MySQL5.x的版本中默认字符集是latin1也就是我们所知道的ISO-8859-1字符集,这个字符集编码并没有包含汉字,所 ...

  9. MySQL索引背后的数据结构及原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  10. Metasploit渗透使用攻略

    msf关于tomcat口令暴力猜解模块 use auxiliary/scanner/http/tomcat_mgr_login show options set rhosts 192.168.2.14 ...