文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

前言

版本:

在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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯