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

object、type和class

  • objectPython 的基础对象类,所有对象都是直接或间接的继承了 object(重用内容)
  • type 是元类,定义了如何创建类,type(name, bases, dict) 可以动态创建类对象,Int、List、objecttype 自身都是由 type 对象实例化(创建对象),同时 type(wh) 可以查看 wh 对象的类型,自定义的对象的类型都是 type
  • class 是语法关键字(Python 少数不是对象的存在),class wh(hm) 可以静态定义一个继承 hm 对象的类对象 wh,实际上是调用的 type 可以简化编程
继承
调用
实例化
实例化
继承
实例化
继承
实例化
type
object
class
List
list-wh
Int
233

简化的说

  • type 是自己的实例 isinstance(type, type) == True
  • objecttype 的实例 isinstance(object, type) == True
  • typeobject 的子类 issubclass(type, object) == True
  • object 不是 type 的子类 issubclass(object, type) == False

以上构成了 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 中写多继承时需要仔细检查包含隐操作的继承关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值