当前位置: 首页 > article >正文

Python 从入门到实战24(类的继承)

        我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。

上篇文章我们讨论了类的定义、使用方法、@property的相关知识。今天我们将学习一下类的继承。

1、继承的基本语法

继承是面向对象编程最重要的特性之一,被继承的类称为父类或者基类。在它的基础上新建的类称为子类或者派生类。

继承的语法格式:

class  ClassName(baseclasslist):

         ‘’’类的帮助信息’’’

         statement      #类体

参数说明:ClassName -----指定类名

          statement -----类体,主要由类变量、方法和属性等定义语句组成

          baseclasslist----要继承的基类,可以有多个,类名之间由,分割

1)举例1:

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    color = "green"  #定义类的属性
    def harvest(self,color):  #定义方法
        print("水果颜色是:"+color+"的!")
        print("水果收获了!")
        print("水果开始是:"+Fruit.color+"的!") #输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    color = "yellow"
    def __init__(self):
        print("我是香蕉")
class Pear(Fruit):     #定义派生类梨
    color = "cyan"
    def __init__(self):
        print("我是梨")
banana = Banana()   #创建类的实例
banana.harvest(Banana.color)#调用基类的方法
pear = Pear()   #创建类的实例
pear.harvest(Pear.color)#调用基类的方法

输出结果参考:

2)举例2

#举例汽车类

class Vehicle:

    def __init__(self, make, model, year):

        self.make = make

        self.model = model

        self.year = year

    def start(self):

        print(f"{self.make} {self.model} started.")

    def stop(self):

        print(f"{self.make} {self.model} stopped.")

class Car(Vehicle):

    def start(self):

        print(f"{self.make} {self.model} revved the engine and started.")

car = Car()

car.start()

这样写执行会报错,car = Car()  因为car 继承Vehicle类,继承init方法

需要加上参数:car = Car("BYD","pro","2025")

改写后正常输出:

2、方法重写

基类的成员都会被派生类继承,当基类中的某个方法不完全适用派生类时,可以在派生类重写类的方法。还是上面的例子,我们重写harvest 方法

举例说明:

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    color = "green"  #定义类的属性
    def harvest(self,color):  #定义方法
        print("水果颜色是:"+color+"的!")
        print("水果收获了!")
        print("水果开始是:"+Fruit.color+"的!") #输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    color = "yellow"
    def __init__(self):
        print("我是香蕉")
class Pear(Fruit):     #定义派生类梨
    color = "cyan"
    def __init__(self):
        print("我是梨")
    def harvest(self,color):
        print("
梨的颜色是:" + color + "的!")
        print("
梨收获了!")
        print("
梨开始是:" + Fruit.color + "的!")  # 输出类的属性
banana = Banana()   #创建类的实例
banana.harvest(Banana.color)#调用基类的方法
pear = Pear()   #创建类的实例
pear.harvest(Pear.color)#调用基类的方法

上面代码黄色阴影的部分是重写方法,输出结果参考:

3、派生类中调用基类的__init__()方法

在派生类中定义__init__()方法时,不会自动调用基类的__init__()。

如下面例子:

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    def __init__(self,color="green"):
        Fruit.color = color
    def harvest(self):  #定义方法
        print("水果开始是:"+Fruit.color+"的!") #输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    color = "yellow"
    def __init__(self):
        print("我是香蕉")
banana = Banana()
banana.harvest()

上面这么写会报错,不能直接调用基类的__init__()

若是想要在派生类中调用基类__init__()方法,需要在派生类中使用super()函数,下面添加黄色背景部分的代码,注意缩进,是在派生类的__init__()方法中调用基类的__init__()方法。

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    def __init__(self,color="green"):
        Fruit.color = color
    def harvest(self):  #定义方法
        print("水果开始是:"+Fruit.color+"的!") #输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    def __init__(self):
        print("我是香蕉")
        super().__init__()
banana = Banana()
banana.harvest()

参考输出:

再举例说明具体的应用:

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    def __init__(self,color="green"):
        Fruit.color = color
    def harvest(self,color):  #定义方法
        print("水果的颜色是:"+self.color+"的!") #输出类的属性
        print("水果开始收获了")
        print("水果开始的颜色是:" + Fruit.color + "的!")  # 输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    color = "yellow"
    def __init__(self):
        print("我是香蕉")
        super().__init__()#调用时并没有输出,只是传color,基类默认的
class Pear(Fruit):     #定义派生类梨
    #color = "cyan"
    def __init__(self,color):
        print("\n我是梨")
        super().__init__(color)  # 调用时并没有输出,只是传color,更改基类默认的
    def harvest(self,color):#重写方法
        print("梨的颜色是:" + color + "的!")
        print("梨收获了!")
        print("梨开始是:" + Fruit.color + "的!")  # 输出类的属性

banana = Banana()
banana.harvest(banana.color)
pear = Pear("cyan")   #创建类的实例
pear.harvest("yellow white")#调用基类的方法

输出结果参考:

今天先写学习到这里了,每天进步一点点。明天也要加油啊!


http://www.kler.cn/news/313227.html

相关文章:

  • SCDN是服务器吗?SCDN防御服务器有什么特点?
  • 操作数据库
  • web前端-HTML常用标签-综合案例
  • kafka动态认证 自定义认证 安全认证-亲测成功
  • 【C#基础】函数传参大总结
  • 算法题总结(一)——二分查找专题
  • [深度学习]神经网络
  • 基于单片机热敏电阻PT100温度控制系统设计
  • SQL编程题复习(24/9/19)
  • 安装Kali Linux后8件需要马上安排的事
  • 门控循环单元(GRU)
  • MySQL高阶1873-计算特殊奖金
  • 【JS】ESMoudle机制与符号绑定
  • 传知代码-多示例AI模型实现病理图像分类
  • 加密与安全_HTTPS TLS 1.2 连接(RSA 握手)的整个过程解读
  • 前端面试CSS常见题目
  • 机器学习之非监督学习(四)K-means 聚类算法
  • 【Docker Nexus3】maven 私库
  • JAVA8新特性——Optional
  • Dockerfile部署xxljob
  • FactualSceneGraph场景图生成
  • OpenAI或于9月24日发布ChatGPT高级语音模式
  • 小白src挖掘 | 记某证书站的虚拟仿真实验平台
  • 提升效率的AI工具集 - 轻松实现自动化
  • ValueError: pic should not have > 4 channels. Got XXX channels.
  • navicat无法连接远程mysql数据库1130报错的解决方法
  • 书生·浦语作业集合
  • AI学习指南深度学习篇-Adam超参数调优与性能优化
  • 神经网络推理加速入门——一个例子看懂流水
  • Redis基础(数据结构和内部编码)