栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python的object、type和class以及MRO与super

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python的object、type和class以及MRO与super

文章目录
    • object、type和class
    • MRO与super
      • 举例

object、type和class

objectPython 的基础对象类,所有对象都是基础对象的儿子
type 是指类型对象类,type(wh) 可以查看 wh 对象的类型,type(name, bases, dict) 可以动态创建类对象
class 是指类,class wh(hm) 可以静态定义一个继承 hm 对象的类对象 wh

任何对象的类型都是 typeint、List、class、objecttype 自身都是由 type 对象实例化,一个实例对象定义链是

  • object --继承-- class
  • type --实例化-- object --实例化-- class --实例化-- hm(实例对象)

type、objectclass 是分工明确的,定义对象需要使用基础的 object,定义管理对象的使用特殊的对象 class 即类,创建对象使用特殊的对象 type 即类型,通过三者共同实现 Python 面向对象

MRO与super

用户定义的对象通过 MRO 结构化表达,MROMethod Resolution Order 是方法解析顺序将自己和所有继承的类做一个排序,自己优先级最高,排序使用C3算法,保证了三件事情

  1. MRO 里任意两个类的相对顺序和自己所有父类的 MRO 里这两个类的相对顺序一致。(单调性)
  2. MRO 里任意两个类的相对顺序和继承图里所有直接继承自这两个类的类在程序中声明的相对顺序一致。(局部优先)
  3. 如果两个类不具有直接的继承关系,那么找到两个类的最小公共子类,这个最小公共子类的多继承顺序靠前的分支上的类具有高优先级。

Pythonsuper 是超类
super(type, class|object).method()

  • super 本身是一个类对象而不是函数对象,如果 super 定义在类内方法中则参数可以省略不写(魔法函数隐操作)type 默认是当前所处类,决定了 MRO 中继承的起始,class|object 默认是 self 即当前所处类的实例,决定了 MRO
举例
class A:
    def say(self):
        print("A")


class B(A):
    def say(self):
        super().say()


class C(A):
    def say(self):
        print("C")


class M(B, C):
    def say(self):
        super().say()


m = M()
m.say()

# Output: C

显然执行 m.say() 时其 selfm ,其 MRO 等价于 M 的即 M,B,C,A,所以 super().say() 时将执行第二继承 Bsuper 虽然此 super 在类对象 B 但规则此时等价于执行 super(B, m).say() 最终执行了 Csay() 方法而不是 B 继承的 A 中的 say() 方法,因此在 Python 中写多继承时需要仔细检查包含隐操作的继承关系

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/822463.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号