前言
在编写类时,并不是每次都要从空白开始。当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率。下面将介绍如何在 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 _ _() 之后,代码及运行结果如下图所示:文章来源:https://www.toymoban.com/news/detail-734659.html
文章来源地址https://www.toymoban.com/news/detail-734659.html
到了这里,关于Python中类的继承细讲的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!