日期:2020年2月9日
作者:Commas
注释:学习就是为了忘记,继承是一种延续……
如果您想了解更多有关Python的知识,那么请点《我的Python浅谈系列目录》
一、继承的概念和语法
继承
是面向对象中三大特性之一,可以让子类拥有父类的属性和方法;另外在子类中,还可以重新定义或修改属性和方法。
# Python3之类继承的语法:
class 类名(父类名):
pass
举个例子,“广东人”类继承自“中国人”类,那么“广东人”类将拥有“中国人”类的属性和方法,如下:
class Chinese:
"""中国人的类"""
language = "Mandarin"
def __init__(self, name, sex="male"):
self.name = name
self.sex = sex
def say_hello(self):
"""中国式打招呼"""
print("{}:吃了饭没呀?".format(self.name))
class Cantonese(Chinese):
"""广东人类,继承中国人类"""
pass
# 实例一个广东老许
xu = Cantonese("老许")
# 属性
print(xu.language)
print(xu.name)
print(xu.sex)
# 方法调用
xu.say_hello()
# 控制台输出:
Mandarin
老许
male
老许:吃了饭没呀?
知识加油站:
Cantonese类是从Chinese类继承(派生)
,所以Cantonese类是Chinese类的子类(派生类)
,Chinese类是Cantonese类的父类(基类)
;
二、方法的重写与super()的调用
广东人打招呼比较喜欢用广东话,所以我们需要重写一下打招呼的方法,如下:
class Cantonese(Chinese):
"""广东人类,继承中国人类"""
def say_hello(self):
"""重写方法,广东人打招呼"""
print("{}:食咗饭未呀?".format(self.name))
# 实例一个广东老许
xu = Cantonese("老许")
# 属性
print(xu.language)
print(xu.name)
print(xu.sex)
# 方法调用
xu.say_hello()
# 控制台输出:
Mandarin
老许
male
老许:食咗饭未呀?
可能另外一个人听不懂广东话,那么就需要使用“中国人”类中的打招呼,我们无需重写,只需要使用super()
来调用父类的打招呼方法即可,如下:
class Cantonese(Chinese):
"""广东人类,继承中国人类"""
def say_hello(self):
"""重写方法,广东人打招呼"""
print("{}:食咗饭未呀?".format(self.name))
# 可能广东话听不懂,所以需要调用父类的普通话再问候一遍
super().say_hello()
xu = Cantonese("老许")
# 属性
print(xu.language)
print(xu.name)
print(xu.sex)
# 方法调用
xu.say_hello()
# 控制台输出:
Mandarin
老许
male
老许:食咗饭未呀?
老许:吃了饭没呀?
小结:
方法的重写,又是一次“就近原则”
的运用。发现子类有say_hello()方法,就使用子类的该方法;若未发现,则使用父类的方法,总之一直往上找,没有就抛出异常。这个解释,也可以从类中的一个内置属性__mro__(method resolution order,即方法搜索顺序)得到证实,如下:
print(Cantonese5.__mro__)
控制台输出:
(<class '__main__.Cantonese'>, <class '__main__.Chinese'>, <class 'object'>)
三、单继承与多继承
类型 | 语法 | 说明 |
---|---|---|
单继承 | class 类名(父类名):pass | 子类拥有父类的属性和方法 |
多继承 | class 类名(父类名1,父类名2,…):pass | 子类拥有所有父类的属性和方法 |
值得指出的是,在多继承中,如果有父类的属性名或方法名相同的时候,还是会按照“就近原则”
进行处理,即先找本身,再从左往右依次寻找各个父类(父类名1,父类名2,…),直至找到为止,如果所有都搜索完仍未找到,那么就抛出异常。
版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/104245600