资讯专栏INFORMATION COLUMN

Python super()就是这样

laznrbfe / 1727人阅读

摘要:所以本文中使用的是新式类,而新式类的搜索算法是算法上面的代码中是父类,是子类,我们在类重新定义了方法,就是在类的功能基础基础上新添功能。在这里的作用就是在子类中调用父类的方法,这个也是在单继承常见调用的用法。

python的类分别有新式类和经典类,都支持多继承。在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现

注意

Python2.2以前的版本:经典类(classic class)时代
经典类是一种没有继承的类,实例类型都是type类型,如果经典类被作为父类,子类调用父类的构造函数时会返回这样的错误 """TypeError: must be type, not classobj"""
这时MRO的方法为DFS(深度优先搜索(子节点顺序:从左到右))。所以本文中使用的是新式类,而新式类的搜索算法是C3算法

class C(object):
    def minus(self,x):
        return x/2

class D(C):
    def minus(self,x):
        super(D, self).minus()
        print "hello"

上面的代码中C是父类,D是子类,我们在D类重新定义了minus方法,就是在C类的功能基础基础上新添print "hello"功能。super在这里的作用就是在子类中调用父类的方法,这个也是在单继承常见调用super()的用法。那么问题来了

class A(object):
    def __init__(self):
        self.n = 10

    def minus(self, m):
        self.n -= m


class B(A):
    def __init__(self):
        self.n = 7

    def minus(self, m):
        super(B,self).minus(m)
        self.n -= 2
b=B()
b.minus(2)
print b.n

那么上面的代码中b.n的输出是什么呢?为什么结果是2呢,而不是5呢?super(B,self).minus(m)明明是调用了父类的minus方法,可是输出结果就是2,是你要明白现在B的实例,而不是A的实例,那么传递的self.n的数值是7,而不是10.

那么对于多继承的时候,super又是怎样工作的呢?来,现在创建一个继承A的C类,然后再创建一个继承B,C的D类,看看怎样调用super是重写方法。

class C(A):
    def __init__(self):
        self.n = 12

    def minus(self, m):
        super(C,self).minus(m)
        self.n -= 5


class D(B, C):
    def __init__(self):
        self.n = 15

    def minus(self, m):
        super(D,self).minus(m)
        self.n -= 2

d=D()
d.minus(2)
print d.n

如上的代码输出的结果是什么呢?别心急,先看看它是怎样运行的。上面提及到新式类寻找子节点时候使用的是C3算法。那么它是怎么找呢。D->B->C->A->object。怎样才能验证这个顺序是对的呢。

D.__mro__
(, , , , )

Mro是什么呢?对于你定义的每一个类,Python 会计算出一个方法解析顺序(Method Resolution Order, MRO)列表,它代表了类继承的顺序。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44469.html

相关文章

  • Python入门学习(八)

    摘要:面向对象类对象实例类是一个抽象的存在实例是真实存在的类对象是类的实例好比说门就是一个类我的屋门就是门的一个实例我的屋门是白颜色的而且打开和关闭时会发出声响不管是颜色还是打开和关闭都是类赋予的属性和行为至于白颜色和打开和关闭时发出的声响是这个 面向对象OOP 类(Class) 对象(Object) 实例(Instance) 类: 是一个抽象的存在实例: 是真实存在的类 对象: ...

    Jaden 评论0 收藏0
  • super 没那么简单

    摘要:说到,大家可能觉得很简单呀,不就是用来调用父类方法的嘛。单继承在单继承中就像大家所想的那样,主要是用来调用父类的方法的。你觉得执行下面代码后,的值是多少呢执行结果如下这个结果说明了两个问题确实调用了父类的方法。 说到 super, 大家可能觉得很简单呀,不就是用来调用父类方法的嘛。如果真的这么简单的话也就不会有这篇文章了,且听我细细道来。? 约定 在开始之前我们来约定一下本文所使用的 ...

    xiguadada 评论0 收藏0
  • pythonsuper类的工作原理

    摘要:我们的小明,就这样被一次次的往上传导到了每一级的函数中,于是每一级打印的都是或者说小明傻傻的分割线更新之前的说法并不准确,参见和准确的说 super 的工作原理如下: def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1] 其中,cls 代表类,inst 代表实例,...

    Anonymous1 评论0 收藏0
  • 神坑·Python 装饰类无限递归

    摘要:如今查找结果有误,说明继承链是错误的,因而极有可能是出错。真相一切都源于装饰器语法糖。核心思路就是不要更改被装饰名称的引用。 本文首发于我的博客,转载请注明出处 《神坑》系列将会不定期更新一些可遇而不可求的坑防止他人入坑,也防止自己再次入坑 简化版问题 现有两个 View 类: class View(object): def method(self): #...

    spacewander 评论0 收藏0
  • python设计模式-桥接模式&比较桥接模式和装饰模式的不同

    摘要:桥接模式和装饰模式的区别设计模式装饰模式桥接模式和装饰模式都是通过将继承关系转换为关联关系从而减少系统中类的数量,降低系统的耦合性。装饰器模式支持多层装饰,通过不同的组合可以实现不同的行为。 产生桥接模式的动机: 假设这样一种情况:我们有大中小型号的毛笔,有红蓝黑三种颜料。如果需要不同颜色,不同型号的毛笔有如下两种设计方法: 为每一种型号的毛笔都提供三种颜料的版本。 将毛笔和颜料分开...

    quietin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<