Python中类的mro与继承关系详解

 更新时间:2022年07月28日 08:40:50   作者:​ 宿者朽命  ​  
这篇文章主要介绍了Python中类的mro与继承关系,文章围绕主题展开初步认识mro的解析顺序,具有一定的参考价值。需要的朋友可以参考一下

前言

版本:

  • windows 10.0
  • python 3.8

Python数字比较与类结构中有简略提到类,那么什么是类呢?

在python中定义一个类很简单,使用关键字class就能实现。

class Animal:
    pass

如何使用它,在类结构中称作实例化。

animal = Animal()

这样,就有了一个Animal的实例。

继承

类的其中一个特性就是能够继承,把Animal类丰富下,将其作为基类:

class Animal:
    property_ = '能够思考'

    def __init__(self, name, age, value):
        self.name_ = name
        self.age_ = age
        self.val_ = val

在这里面,property_作为类属性,无需实例化就能使用,而__init__下的self.name_, self.age_和self.val_需要在实例化后才能使用,且这里__init__需要传入参数,其中self用来指代类本身,不作为传参值。

print(Animal.property_)  # 输出:能够思考
print(Animal.name_)   # 引发AttributeError错误

a = Animal('阿黑', 12, 70)
print(a.property_)  # 能够思考
print(a.name_)  # 阿黑
print(a.age_)  # 12
print(a.val_)  # 70
复制代码

Animal类可以正常使用,再写一个Monkey类,继承Animal类。

class Monkey(Animal):
    pass

Monkey后面调用Animal类,继承了其属性及方法,也可通过实例化,查看Monkey实例的属性。

print(Monkey.property_)  # 类属性: 能够思考

m = Monkey('阿黄', 15, 40)
print(m.name_)  # 阿黄
print(m.age_)  # 15
print(m.val_)  # 40

当然也能继承类,对其已有的方法进行改写,这里再定义一个Cat类。

class Cat(Animal):

    def __init__(self, name, age):
        self.name_ = '我是' + name
        self.age_ = age

Cat类继承后对__init__进行了改写,修改了name_,并且删除了val_。

print(Cat.property_)  # 类属性:能够思考

c = Cat('小花', 6)
print(c.name_)  # 我是小花
print(c.age_)  # 6
print(c.val_)  # 引发AttributeError报错

对于类属性还是能使用,不见的val_再调用就会引发报错。

除此之外,如果想在保留基类的属性基础上增加属性,可以用super()进行处理:

class Fish(Animal):

    def __init__(self, name, age, val, env):
        super().__init__(name, age, val)
        self.env_ = env

在实例化Fish类时,需要多传入一个生活环境env参数:

f = Fish('小鲤', 2, 57, '水里')
print(f.env_)  # 水里

mro

mro的含义为方法解析顺序,在类的继承中,明白解析顺序是尤为重要的,对于上述几个类可以简单看下mro的顺序情况。

Animal.mro()
# [__main__.Animal, object]

Monkey.mro()
# [__main__.Monkey, __main__.Animal, object]

Cat.mro()
# [__main__.Cat, __main__.Animal, object]

Fish.mro()
# [__main__.Fish, __main__.Animal, object]

mro的解析顺序是从左至右,越在左边优先级越高,可以看到最先解析的是当前类本身,再是继承的上一个类,最后是原生object类。上述罗列的所有类,继承关系都很简单,mro的顺序也简单明了。

总结

到此这篇关于Python中类的mro与继承关系详解的文章就介绍到这了,更多相关Python mro内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python模拟伯努利试验和二项分布代码实例

    Python模拟伯努利试验和二项分布代码实例

    这篇文章主要介绍了Python模拟伯努利试验和二项分布代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python numpy 提取矩阵的某一行或某一列的实例

    Python numpy 提取矩阵的某一行或某一列的实例

    下面小编就为大家分享一篇Python numpy 提取矩阵的某一行或某一列的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • pytorch masked_fill报错的解决

    pytorch masked_fill报错的解决

    今天小编就为大家分享一篇pytorch masked_fill报错的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python实现图像最近邻插值

    python实现图像最近邻插值

    这篇文章主要介绍了python实现图像最近邻插值,图像插值技术即Nearest Neighbour Interpolate是图像超分辨率领域的重要研究方法之一,其目的是根据已有的低分辨率图像,获得高分辨率图像,下面来看看文章具体的叙述,需要的朋友可以参考一下
    2022-03-03
  • python requests response值判断方式

    python requests response值判断方式

    这篇文章主要介绍了python requests response值判断方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Selenium中免登录的实现方法option详解

    Selenium中免登录的实现方法option详解

    在selenium中有很多种可以实现网站的免登录,option就是其中的一种做法,这篇文章主要介绍了Selenium中免登录的实现方法option,需要的朋友可以参考下
    2022-12-12
  • python中的正则表达式,贪婪匹配与非贪婪匹配方式

    python中的正则表达式,贪婪匹配与非贪婪匹配方式

    这篇文章主要介绍了python中的正则表达式,贪婪匹配与非贪婪匹配方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Python命令行解析器argparse详解

    Python命令行解析器argparse详解

    大家好,本篇文章主要讲的是Python命令行解析器argparse详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • Python动态生成多维数组的方法示例

    Python动态生成多维数组的方法示例

    这篇文章主要介绍了Python动态生成多维数组的方法,涉及Python数组动态遍历、添加、打印等相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • Python Barbershop实现照片换发型功能

    Python Barbershop实现照片换发型功能

    这篇文章主要为大家介绍了一个开源项目(Barbershop),可以将照片中的发型更换成另一个,文中实现过程讲解详细,感兴趣的可以学习一下
    2022-01-01

最新评论