首页 > 编程语言 >Python 子类继承了多个父类 , MRO查找调用方法

Python 子类继承了多个父类 , MRO查找调用方法

时间:2023-06-05 20:11:11浏览次数:39  
标签:__ Python 子类 MRO 父类 方法 method mro

 

 

在 Python 中,如果一个子类继承了多个父类,而这些父类中都有同名的方法或属性,那么子类在调用这个方法或属性时,会按照 MRO(Method Resolution Order,方法解析顺序)的规则进行查找和调用。在 Python 中,MRO 的顺序是由 C3 算法计算出来的。C3 算法是一种基于拓扑排序和合并的算法,用于计算出多继承的类的方法解析顺序。

如果一个子类没有定义与父类同名的方法或属性,那么当调用这个方法或属性时,就会按照 MRO 的顺序访问父类的方法或属性。MRO 的顺序是由子类的 mro 属性决定的,该属性是一个元组,其中包含了所有父类和子类的类对象。

如果想要控制子类先访问哪个父类的方法,可以通过修改子类的 mro 属性来实现。例如,如果想要让子类先访问父类 A 的方法,可以这样写:

 

 

class A:
    def method_a(self):
        print("A's method_a")

class B:
    def method_a(self):
        print("B's method_a")

class C(A, B):
    pass

class D(B, A, C):
    __mro__ = (D, B, A, C)

d = D()
d.method_a()  # 输出:B's method_a

 

在上面的例子中,子类 D 继承了父类 A 和 B,而这两个父类都定义了 method_a 方法。为了让子类先访问父类 B 的方法,可以将子类的 mro 属性修改为 (D, B, A, C)。这样,当子类调用 method_a 方法时,就会先访问父类 B 的方法。

需要注意的是,修改 mro 属性可能会导致继承链的混乱和代码的可读性变差,因此应该谨慎使用。

 

 


 

 

 

 

在 Python 中,无法直接只针对某个方法来修改 __mro__ 属性,因为 __mro__ 属性是类级别的,它影响到整个类的方法解析顺序。同时,一个类的多个方法可能会共享相同的 MRO,因此修改其中一个方法的 MRO 可能会影响到其他方法的继承顺序。

如果你需要针对某个方法的继承顺序进行修改,可以考虑将该方法移到一个单独的基类中,并让该基类继承自原来的父类。这样就可以通过修改基类的 __mro__ 属性来实现针对该方法的继承顺序修改,而不会影响到其他方法的继承顺序。例如:

 

class MyBaseClass(object):
    # 定义针对 method_a 的 MRO
    __mro__ = (object,)

class MyClass(MyBaseClass, OtherBaseClass):
    def method_a(self):
        pass

    def method_b(self):
        pass

 

在上面的示例中,我们将 method_a 移到了 MyBaseClass 中,并将 MyBaseClass 继承自 object 类。这样就可以通过修改 MyBaseClass.__mro__ 来实现针对 method_a 的继承顺序修改,而不会影响到 method_b 和其他方法的继承顺序。

 

标签:__,Python,子类,MRO,父类,方法,method,mro
From: https://www.cnblogs.com/angdh/p/17458816.html

相关文章

  • Python生成器深度解析:构建强大的数据处理管道
    前言生成器是Python的一种核心特性,允许我们在请求新元素时再生成这些元素,而不是在开始时就生成所有元素。它在处理大规模数据集、实现节省内存的算法和构建复杂的迭代器模式等多种情况下都有着广泛的应用。在本篇文章中,我们将从理论和实践两方面来探索Python生成器的深度用法。生......
  • Python生成器深度解析:构建强大的数据处理管道
    前言生成器是Python的一种核心特性,允许我们在请求新元素时再生成这些元素,而不是在开始时就生成所有元素。它在处理大规模数据集、实现节省内存的算法和构建复杂的迭代器模式等多种情况下都有着广泛的应用。在本篇文章中,我们将从理论和实践两方面来探索Python生成器的深度用法。......
  • python机器学习——点评评论分析
    (一)选题背景:随着广大用户“即需要、即外卖、即使用”的方便快捷的“外卖生活方式”的形成和普及,如今外卖行业不仅可以满足用户餐饮商品的在线即时购物需求,还可以满足饮食、水果、酒水饮料、家居日用、母婴用品、数码家电、服饰鞋包、美妆护肤、医药等各种品类商品。对于服务行业来......
  • python时间和日期处理
    1.时间处理time相关操作:获取当前时间时间转字符串字符串转时间计算时间差importtimenow=time.time()#时间戳从1970年1月1日0点0分0秒到此刻的秒数print(f"{now=}")now_st=time.localtime(now)#标准时间年月日,时分秒print(f"{now_st}")now_str=time.strftim......
  • Python实验课5
    实验任务六实验源码:1withopen('data6.csv','r',encoding='gbk')asf:2data=f.readlines()3data1=[str(eval(data[i]))foriinrange(1,len(data))]4data2=[str(int(eval(data[i])+0.5))foriinrange(1,len(data))]5info=......
  • Python网络爬虫-东方财经
    (一)、选题的背景为什么要选择此选题?要达到的数据分析目标是什么?从社会、经济、技术、数据来源等方面进行描述(200字以内)(10分) 经济蓬勃发展的世纪,财经新闻报道了国内外的经济数据、政策、企业动态等信息,这些信息对我们了解宏观经济的形势非常重要。通过财经新闻,我们可以了解到......
  • python文件路径和内容处理以及异常处理
    1.文件路径绝对路径和相对路径绝对路径:绝对路径,从盘符开始的路径(d:\data\file\abc.txt)frompathlibimportPathpath=Path('test.txt')print(path.absolute())相对路径:相对于当前的路径,当前是一个变量,在执行python时,所处的目录(./abc/a.txt ../ab/c.txttest.txt)没有......
  • python作用域
    1变量作用域变量(所有在内存中的数据)作用域:LEGBL:Local本地作用域(局部作用域),函数内部E:Enclosed闭包作用于,两个函数之间的,G:Gobal全局作用域(这个文件)B:Builtln内置作用域(全局通用)(pprint(builtins))内置:在任何地方,都可以直接使用全局:在本文件的任何地方,可以直接使用访问顺序:当我......
  • # yyds干货盘点 # Python中encoding='utf-8-sig'是什么意思
    大家好,我是皮皮。一、前言前几天在Python白银群【凡人不烦人】问了一个Python编码的问题,这里拿出来给大家分享下。二、实现过程这里大家一起来学习下。在Python中,encoding='utf-8-sig' 是一种编码格式,用于指定字符串的编码方式。具体来说,utf-8-sig 编码格式是 utf-8 编码的一种......
  • python解析
    关于beautifulsoupBeautifulSoup用来从HTML或XML文件中提取数据现在最新的版本是beautifulsoup3已经停止开发,现在最新推荐使用的是beautifulsoup4安装pipinstallbeautifulsoup4beautifulsoup要用起来还需要一个解析器的东西,官网列出了主要的一些解析器除了第一个标......