Python3之类的继承

日期: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章