Python中类的继承细讲

文章目录

  • 前言
  • 一、继承的基本语法
  • 二、方法重写
  • 三、派生类中调用基类的 _ _init _ _() 方法

前言

  在编写类时,并不是每次都要从空白开始。当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率。下面将介绍如何在 Python 中实现继承

一、继承的基本语法

  继承面向对象编程最重要的特性之一,它源于人们认识客观世界的过程,是自然界普遍存在的一种现象。例如,我们每一个人都从祖辈和父母那里继承了一些体貌特征,但是每个人却又不同于父母,因为每个人都存在自己的一些特性,这些特性是独有的,在父母身上并没有提现。在程序设计中实现继承,表示这个类拥有它继承的类的所有公有成员或者受保护成员。在面向对象编程中,被继承的类称为父类或基类新的类称为子类或者派生类
  通过继承不仅可以实现代码的重用,还可以通过继承来理顺类与类之间的关系。在 Python 中,可以在类定义语句中,类名右侧使用一对小括号将要继承的基类名称括起来,从而实现类的继承。具体的语法格式如下:

class ClassName(baseclasslist): 
	'''类的帮助信息'''  # 类文档字符串
	statement  # 类体

参数说明

  • ClassName:用于指定类名。
  • baseclasslist:用于指定要继承的基类,可以有多个,类名之间用逗号 “,” 分隔。如果不指定,将使用所有 Python 对象的基类 object
  • ‘’‘类的帮助信息’‘’:用于指定类的文档字符串,定义该字符串后,在创建类的对象时,输入类名和左侧的括号 “(” 后,将显示该信息。
  • statement:类体,主要由类变量(或类成员)、方法和属性等定义语句组成。如果在定义类时,没想好类的具体功能,也可以在类体中直接使用 pass 语句代替。

  例如,定义一个水果类 Fruit(作为基类),并在该类中定义一个类属性(用于保存水果默认的颜色)和一个 harvest() 方法,然后创建 Banana 类和 Grape 类,都继承自 Fruit 类,最后创建 Banana 类和 Grape 类的实例,并调用 harvest() 方法(在基类中编写),代码如下:

class Fruit:  # 定义水果类(基类)
    color = '绿色'  # 定义类属性
    def harvest(self, color):
        print('水果是{}的'.format(color))  # 输出的是形式参数color
        print('水果已经收获......')
        print('水果原来是{}的'.format(Fruit.color))  # 输出的是类属性color
class Banana(Fruit):  # 定义香蕉类(派生类)
    color = '黄色'
    def __init__(self):
        print('我是香蕉')
class Grape(Fruit):  # 定义葡萄类(派生类)
    color = '紫色'
    def __init__(self):
        print('我是葡萄')
banana = Banana()  # 创建类的实例(香蕉)
banana.harvest(banana.color)  # 调用基类的harvest()方法
grape = Grape()  # 创建类的实例(葡萄)
grape.harvest(grape.color)  # 调用基类的harvest()方法

  执行上面代码,将显示如下图所示结果:

  从运行结果中可以看出,虽然在 Banana 类和 Grape 类中没有 harvest() 方法,但是 Python 允许派生类访问基类的方法

二、方法重写

  基类的成员都会被派生类继承,当基类中的某个方法不完全适用于派生类时,就需要在派生类中重写父类的这个方法。
  在上面的实例代码中,基类里面定义的 harvest() 方法,无论派生类是什么水果都显示 “水果…”,而没有将水果的名字显示上去,如下图所示:

  如果想要针对不同水果给出不同的提示,可以在派生类中重写 harvest() 方法。代码如下:

class Fruit:  # 定义水果类(基类)
    color = '绿色'  # 定义类属性
    def harvest(self, color):
        print('水果是{}的'.format(color))  # 输出的是形式参数color
        print('水果已经收获......')
        print('水果原来是{}的'.format(Fruit.color))  # 输出的是类属性color
class Banana(Fruit):  # 定义香蕉类(派生类)
    color = '黄色'
    def __init__(self):
        print('我是香蕉')
    def harvest(self, color):
        print('香蕉是{}的'.format(color))  # 输出的是形式参数color
        print('香蕉已经收获......')
        print('香蕉原来是{}的'.format(Fruit.color))  # 输出的是类属性color
banana = Banana()  # 创建类的实例(香蕉)
banana.harvest(banana.color)  # 调用基类的harvest()方法

  运行上面代码后,结果显示如下:

我是香蕉
香蕉是黄色的
香蕉已经收获......
香蕉原来是绿色的

三、派生类中调用基类的 _ _init _ _() 方法

  在派生类中定义 _ _ init _ _() 方法时,不会自动调用基类的 _ _ init _ _() 方法。例如,定义一个 Fruit 类,在 _ _ init _ _() 方法中创建类属性 color,然后在 Fruit 类中定义一个 harvest() 方法,在该方法中输出类属性 color 的值,再创建继承自 Fruit 类的 Banana 类,最后创建 Banana 类的实例,并调用 harvest() 方法,代码如下:

class Fruit:  # 定义水果类(基类)
    def __init__(self, color = '绿色'):
        Fruit.color = color  # 定义类属性
    def harvest(self):
        print('水果原来是{}的'.format(Fruit.color))  # 输出的是类属性color
class Banana(Fruit):  # 定义香蕉类(派生类)
    def __init__(self):
        print('我是香蕉')
banana = Banana()  # 创建类的实例(香蕉)
banana.harvest()  # 调用基类的harvest()方法

  执行上面代码后,将显示如下图所示的异常信息。

  因此,要让派生类调用基类的 _ _ init _ _() 方法进行必要的初始化,需要在派生类使用 super() 函数调用基类的 _ _ init _ _() 方法,用法格式如下:

super()._ _init_ _([参数1, ....])

注意:如果基类的初始化方法中有参数传入,则这里需要在 _ _init_ _() 括号中写入形式参数

  在上面代码中加入 super()._ _ init _ _() 之后,代码及运行结果如下图所示:

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年11月3日
下一篇 2023年11月3日

相关推荐