python – 超级尝试MRO中的每个类
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之前出现? 解决方法
不,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语句. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |