返回顶部
首页 > 资讯 > 后端开发 > Python >Python中类的mro与继承关系详解(二)
  • 615
分享到

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

2024-04-02 19:04:59 615人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言多重继承思考片刻总结前言 版本: windows 10.0python 3.8 多重继承 在Python数字比较与类结构中有简略提到类,且在Python中类的mro与继承关系

前言

版本:

多重继承

Python数字比较与类结构中有简略提到类,且在Python中类的mro与继承关系详解稍有解释继承关系,用到一个基类Animal如下:

class Animal:
    property_ = '能够思考'

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

再定义Action活动作为另一个基类:

class Action:

    def __init__(self, action, val):
        self.action_ = action
        self.val_ = val
  • 现在需定义一个Dog类,不仅是动物,还能够跑,可以来继承上面两个类来定义:
class Dog(Animal, Action):

    def __init__(self, name, age, action, val):
        Animal.__init__(self, name, age, val+1)
        Action.__init__(self, action, val)

dog = Dog('大福', 8, '跑', 78)
print(dog.__dict__)
# {'name_': '大福', 'age_': 8, 'val_': 78, 'action_': '跑'}

发现打印出的实例属性,好像字典的键值更新,先初始化Animal时,val传入的值为79,而后被更新为78,这里为什么不能像继承单个类一样直接用super方法代替呢。

上一篇有提到mro解析顺序,可进行尝试,不重写__init__方法,发现Dog类只能传入三个参数,且都为Animal类的参数,因为继承的两个父类都有该方法,优先继承左边的父类方法,如果想都继承可以考虑这样的形式,然而会提高后续维护的困难性。

可以将最左边的父类改成super方式:

class Dog(Animal, Action):

    def __init__(self, name, age, action, val):
        super().__init__(name, age, val+1)
        Action.__init__(self, action, val)

mro解析顺序,与上面所述一致:

Dog.mro()
# [__main__.Dog, __main__.Animal, __main__.Action, object]
  • 祖孙类

如再进行继承,视Dog为父类,其Animal,Action都为祖父类,定义一个Pet类:

class Pet(Dog):
    pass
pet = Pet('大福', 8, '跑', 78)

传入参数,和实例化的对象跟Dog一样,如果需要改写某个方法,可以参照之前的方法进行改写,另外若在保留原方法的逻辑上进行补充则用super方法。

Pet类的mro:

Pet.mro()
# [__main__.Pet, __main__.Dog, __main__.Animal, __main__.Action, object]

思考片刻

通过上面的继承及对应的mro解析顺序,可以思考以下通过多重继承类后,输出的x属性值为多少:

class Alpha:
    def __init__(self, val):
        self.x = val

class Beta(Alpha):
    pass

class Gamma:
    def __init__(self, val):
        self.x = val + 1
class Omega(Gamma):
    def __init__(self, val):
        super().__init__(val + 1)
class Kappa(Beta, Omega):
    pass
k = Kappa(1)
print(k.x)

如果脑内没有一个mro解析顺序图,这里准备了:

[__main__.Kappa, __main__.Beta, __main__.Alpha, __main__.Omega, __main__.Gamma, object]

这里或许会有疑问,Beta后面不是Omega吗?怎么到Alpha了,可以先看下Omega,继承Gamma,而GammaAlpha并不是同源的,类似于Dog类的继承,那么优先就会使用Alpha的__init__方法,所以在传入参数值1的时候,仅运行了Alpha内的self.x = val,属性x被赋值成1,在最后print输出即为1,打印结果检查:

print(k.x)
# 1

若把Gamma类改成继承Alpha类,再次猜测print(k.x)的值为多少?

class Alpha:
    def __init__(self, val):
        self.x = val

class Beta(Alpha):
    pass

class Gamma(Alpha):
    def __init__(self, val):
        self.x = val + 1

class Omega(Gamma):
    def __init__(self, val):
        super().__init__(val + 1)

class Kappa(Beta, Omega):
    pass

k = Kappa(1)
print(k.x)

查看mro解析顺序:

[__main__.Kappa, __main__.Beta, __main__.Omega, __main__.Gamma, __main__.Alpha, object]

此时发现Alpha解析优先级排在最后,BetaOmega可以看做是BetaGamma的优先级比较,因为Omega继承Gamma,且重写了__init__方法,所以当传入参数时会对Gamma类的属性进行赋值,虽然Beta类直接继承Alpha,但Gamma类也直接继承,所以Alpha解析顺序需要排在Gamma后面,从而当Kappa类传入参数时,经过Omega的super加1,传入到Gamma处时为:self.x = val + 1中的val为2,输出的k.x的值即为3,查看打印结果:

print(k.x)
# 3

总结

通过连续两篇对类继承及mro解析顺序的说明,理解类在多重继承中的变化,无论继承多少遍,总归要回归本心,但也不能胡乱继承,有条理的,有意义的继承,才能让自己乃至他人更好理解当下写出的类。

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

--结束END--

本文标题: Python中类的mro与继承关系详解(二)

本文链接: https://lsjlt.com/news/119691.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中类的mro与继承关系详解(二)
    目录前言多重继承思考片刻总结前言 版本: windows 10.0python 3.8 多重继承 在Python数字比较与类结构中有简略提到类,且在Python中类的mro与继承关系...
    99+
    2024-04-02
  • Python中类的mro与继承关系详解
    目录前言类继承mro总结前言 版本: windows 10.0python 3.8 类 在Python数字比较与类结构中有简略提到类,那么什么是类呢? 在python中定义一个类很简...
    99+
    2024-04-02
  • python子类在多继承中怎么使用MRO
    本篇内容主要讲解“python子类在多继承中怎么使用MRO”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python子类在多继承中怎么使用MRO”吧!子类在多继承中使用MRO机制在Python中...
    99+
    2023-07-05
  • C3 线性化算法与 MRO之Python中的多继承
    目录什么是 MRONew-style Class vs. Old-style Class理解 old-style class 的 MRO理解 new-style class 的 MR...
    99+
    2024-04-02
  • python子类在多继承中使用MRO机制原理
    目录子类在多继承中使用MRO机制算法原理查看MRO列表子类在多继承中使用MRO机制 在Python中,当定义一个类时,可以指定它的父类。一个子类继承了其所有父类的属性和方法,并且可...
    99+
    2023-03-24
    python子类多继承MRO python子类多继承MRO
  • C#中的类继承详解
    目录前言类的继承注意事项寄语总结前言 在日常的程序编码工作中,我们的最终目标是完成公司交给自己的开发任务,核心目标是写出好代码。 那么什么是好代码? 高内聚,低耦合 想必从事编码工作...
    99+
    2024-04-02
  • python类的继承实例详解
    python 类的继承 对于许多文章讲解python类的继承,大多数都是说一些什么oop,多态等概念,我认为这样可能对有一定基础的开发者帮助不是那么大,不如直接用在各种情况下所写的代码,来展示对于某一种代码...
    99+
    2022-06-04
    详解 实例 python
  • Python 类的继承实例详解
    Python 类的继承详解 Python既然是面向对象的,当然支持类的继承,Python实现类的继承比JavaScript简单。 Parent类: class Parent: parentAt...
    99+
    2022-06-04
    详解 实例 Python
  • JavaScript 中的继承:了解类关系的本质
    ...
    99+
    2024-04-02
  • 详解C++中单继承与多继承的使用
    目录前言1.继承的概念和定义(1)继承的概念(2)继承的定义方法(2)继承后子类的成员类型2.基类与派生类的赋值转换(1)派生类赋值给基类(2)基类给派生类3.继承中的作用域(1)隐...
    99+
    2024-04-02
  • 详解Java语言中的抽象类与继承
    目录一、实验目的二、实验要求三、实验报告要求四、实验小结一、实验目的 1、掌握抽象类的设计; 2、掌握抽象方法方法的实现; 3、熟悉类的向下向上转型,以及子类实例化父类对象的基本要求...
    99+
    2022-11-13
    Java抽象类 继承 Java抽象类 Java 继承
  • Java 继承的继承体系:揭示超类和子类之间的关系
    Java 继承是一种面向对象编程特性,允许一个类(子类)继承另一个类(超类)的属性和方法。这为代码重用和多态性提供了强大的机制。 超类和子类关系 超类:也称为父类或基类,是提供属性和方法的原始类。 子类:也称为派生类或后代类,从超类继承...
    99+
    2024-03-12
    Java 继承体系
  • python的继承详解
    目录1、单继承:子类只继承一个父类2、多继承:子类继承多个父类3、子类重写父类的同名属性和方法4、子类调用父类同名属性和方法5、 6、调用父类方法super()总结1、单继...
    99+
    2024-04-02
  • C++ 函数继承详解:如何使用 RTTI 来检查类型继承关系?
    rtti 是一种机制,允许您在运行时检查类型的继承关系。使用 rtti,您可以获取有关对象的类型信息,这对于验证继承关系非常有用。要检查继承关系,请使用 typeid 运算符获取对象的类...
    99+
    2024-05-03
    c++ 函数继承
  • c++中的继承关系
    1 什么是继承 继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称...
    99+
    2024-04-02
  • Python类的继承与多态详细介绍
    目录概念类的创建类的继承多态的使用概念 类(Class): 用来描述具有相同的属性和方法的对象的集合。 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类...
    99+
    2024-04-02
  • C++ 函数继承详解:如何理解继承中的“is-a”和“has-a”关系?
    C++ 函数继承详解:掌握“is-a”和“has-a”关系 什么是函数继承? 函数继承是 C++ 中一种将派生类中定义的方法与基类中定义的方法关联起来的技术。它允许派生类访问和重写基类...
    99+
    2024-05-02
    c++ 继承
  • PHP中类继承关系的示例分析
    这篇文章将为大家详细讲解有关PHP中类继承关系的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在PHP中,我时常会写一个类,类写了一个共用方法,然后让子类去继承就...
    99+
    2024-04-02
  • Js类的构建与继承案例详解
    JS里类的定义和继承实在五花八门,所以单独开一个笔记本记录。 定义 派生于Object的方式 1.new Object:在创建对象后动态定义属性、方法 var Car = new...
    99+
    2024-04-02
  • Python类中的单继承和多继承用法
    本篇内容主要讲解“Python类中的单继承和多继承用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python类中的单继承和多继承用法”吧!前言Python面向对象编程语言,有List、Str...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作