乐趣区

关于python:Python多继承多继承顺序多继承顺序实力分析新式类和旧式类

上一篇文章讲述了多继承的概念、语法、代码演练、应用注意事项,有趣味的能够看下,这篇文章是基于上篇文章的扩大科普,简略晓得一下就好。

一、Python 中的 MRO —— 办法搜寻程序【多继承程序】

所谓办法搜寻程序,就是让某个对象调用某个办法时,python 的解释器是依照什么样的程序在创立这个对象的类,以及父类之间搜寻办法的。在 python 中针对类提供了一个内置属性 mro,能够查看办法搜寻程序。(mro 前后两个下划线)

MRO 是 method resolution order 缩写,次要用于在多继承时判断办法、属性的调用门路。

确定 C 类对象调用办法的程序:上篇文章中代码不变,在前面输入:print(C.__mro__)

具体代码:

class A:

    def test(self):
        print("A --- test 办法")

    def demo(self):
        print("A --- demo 办法")


class B:

    def demo(self):
        print("B --- demo 办法")

    def test(self):
        print("B --- test 办法")


class C(B, A):
    pass


# 创立子类对象
c = C()

c.test()
c.demo()

print(C.__mro__)

执行后果:

后果过程阐明:

在控制台输入了一个元组。当让 C 类创立的对象办法时,Python 解释器会首先在 C 类中查找有没有这个办法,如果有就会间接执行,而不会向后搜寻。如果没有找到这个办法,就会依照元组的程序从左向右查找第二个类中是否有这个办法,如果在 B 类中找到就会间接执行也不会向后搜寻。如果没有找到就会依照从左向右的程序持续向下寻找,在第三个类中 A 类中持续查找有没有提供这个办法,如果找到就执行,如果没有找到持续向后寻找下一个类 object 类,如果还没找到程序就会报错。
(在 python3 中 object 是所有类的基类,也就是只有定义一个类,这个类的最终基类都是 object 类,简略来讲 object 是 python 中所有类的祖宗类)

总结:

在搜寻办法时,是依照__mro__ 的输入后果从左向右的程序查找的
如果在以后类中找到办法,就间接执行,不再搜寻如果没有找到,就查找下一个类中是否有对应的办法,如果找到,就间接执行,不再搜寻
如果找到最初一个类,还没有找到办法,程序报错

二、旧式类和新式(经典)类【科普】

object 是 python 为所有对象提供的基类,提供一些内置的属性和办法,能够应用 dir 函数来查看。

旧式类:

以 object 为基类的类,举荐应用。

经典类:

不以 object 为基类的类,不举荐应用。

旧式类和经典类在 python2.x 和 Python3.x 之间的区别:

在 python3.x 中定义类时,如果没有指定父类,会默认应用 object 作为该类的基类,python3.x 中定义的类都是旧式类。在 python2.x 中定义类时,如果没有指定父类,则不会以 object 为基类。

代码体验,如图:

  1. 基于 Python2.0

2. 基于 Python3.x

旧式类和经典类在多继承时,会影响到办法的搜寻程序。留神:为了保障编写的代码可能同时在 python2.x 和 python3.x 运行,今后在定义类时,如果没有父类,倡议对立继承自 object

class 类名(object):
    pass

更多相干 Python 教程能够移步去 Python 自学网(www.wakey.com.cn/)从根底入门收费课程开始,逐渐深刻学习 python 全栈体系课程,适宜新手入门到精通全栈开发。

退出移动版