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

python – 超级尝试MRO中的每个类,第1张

概述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):
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()

这打印:

basemixin amixin btop

我对多种事情感到惊讶. 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语句.

总结

以上是内存溢出为你收集整理的python – 超级尝试MRO中的每个类全部内容,希望文章能够帮你解决python – 超级尝试MRO中的每个类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1194280.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存