加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 超级尝试MRO中的每个类

发布时间:2020-12-20 12:11:01 所属栏目:Python 来源:网络整理
导读:class Base(object): def m(self): print 'base'class MixinA(Base): def m(self): super(MixinA,self).m() print 'mixin a'class MixinB(Base): def m(self): super(MixinB,self).m() print 'mixin b'class Top(MixinB,MixinA,Base): def m(self): super(To
class Base(object):
    def m(self):
        print 'base'


class MixinA(Base):
    def m(self):
        super(MixinA,self).m()
        print 'mixin a'


class MixinB(Base):
    def m(self):
        super(MixinB,self).m()
        print 'mixin b'


class Top(MixinB,MixinA,Base):
    def m(self):
        super(Top,self).m()
        print 'top'


t = Top()
t.m()

这打印:

base
mixin a
mixin b
top

我对多种事情感到惊讶. Top的第一个MRO是(< class'Top'>,< class'MixinB'>,< class'MixinA'>,< class'Base'>,< type'object'> )

>为什么mixin a在mixin b之前出现?
>超级尝试MRO中的每个类(与返回找到第一个属性时搜索属性不同)?

解决方法

不,super()不会“尝试”MRO中的每个班级.您的代码链接调用,因为每个被调用的方法都有另一个super()调用. Top.m()调用super().m(),它解析为MixinB.m();反过来又使用super()等.

mixin a在mixin b之前打印,因为你在super()调用之后打印,所以首先执行MRO中的最后一个元素. super()调用只是另一个方法调用,因此在super().m()调用完成之前,不会执行此类调用之后的print语句.

您的MRO如下:

>>> type(t).__mro__
(<class '__main__.Top'>,<class '__main__.MixinB'>,<class '__main__.MixinA'>,<class '__main__.Base'>,<type 'object'>)

所以Base.m()最后被调用,然后先打印,然后是MixinA,然后是MixinB,Top是最后打印的.

请注意,使用自我的MRO,而不是作为第一个参数传递给super()的类;因此,对于任何给定实例,MRO在层次结构的所有调用中都是稳定的.

如果您希望按照MRO调用的顺序执行打印语句,则必须在调用MRO中的下一个m()方法之前放置print语句.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读