
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中的每个类(与返回找到第一个属性时搜索属性不同)?
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中的每个类所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)