原文地址:https://www.cnblogs.com/miyauchi-renge/p/10923127.html
super().method()是调用父类中的方法,这个搜索顺序当然是按照MRO从前向后开始进行的
super([type][, object-or-type])
根据官方文档,super
函数返回一个委托类type
的父类或者兄弟类方法调用的代理对象。super
函数用来调用已经再子类中重写过的父类方法。
这句话其实很难看明白,为什么除了父类还可能是兄弟类?
要理解这句话,先谈谈super
的参数的传入方式不同带来的不同之处
常见的是直接调用super()
,这其实是super(type, obj)
的简写方式,将当前的类传入type
参数,同时将实例对象传入type-or-object
参数,这两个实参必须确保isinstance(obj, type)
为True
。
使用该方法调用的super
函数返回的代理类是obj
所属类的MRO中,排在type之后的下一个父类。
1 class ChangeAbs(int): 2 def __new__(cls, val): 3 # 填入使用super()内建函数去捕获对应父类以调用它的__new__()方法来计算输入数值的绝对值的代码 4 # 求一个数的绝对值的函数为abs() 5 # 返回最后的结果 6 ########## Begin ########## 7 return super(ChangeAbs, cls).__new__(cls, abs(val)) 8 ########## End ########## 9 10 class SortedKeyDict(dict): 11 def keys(self): 12 # 填入使用super()内建函数去捕获对应父类使输入字典自动排序的代码 13 # 返回最后的结果 14 ########## Begin ########## 15 return sorted(super(SortedKeyDict, self).keys()) 16 ########## End ##########