为了账号安全,请及时绑定邮箱和手机立即绑定

将任务的代码改了一下,发现不是想要的结果

class Person(object):

    def __init__(self):

        print 'person'


class Student(Person):

    def __init__(self):

        super(Student,self).__init__()

        print 'student'


class Teacher(Person):

    def __init__(self):

        super(Teacher,self).__init__()

        print 'teacher'


class SkillMixin(object):

    def __init__(self):

        print 'skill'


class BasketballMixin(SkillMixin):

    def __init__(self):

        super(BasketballMixin,self).__init__()

        print 'basketball'

    def skill(self):

        return 'basketball'


class FootballMixin(SkillMixin):

    def __init__(self):

        super(FootballMixin,self).__init__()

        print 'football'

    def skill(self):

        return 'football'


class BStudent(BasketballMixin,Student):

    def __init__(self):

        super(BStudent,self).__init__()


class FTeacher(FootballMixin,Teacher):

    def __init__(self):

        super(FTeacher,self).__init__()


s = BStudent()

为什么不是person  student  skill basketball

正在回答

2 回答

1、Python中的类的多重继承用的是深度优先算法。

2、当在某个父类中找到子类调用的方法时,就停止搜索。


整个程序的流程是:

执行s=BStudent()语句

进入BStudent(BasketballMixin,Student)中

→调用__init__(self)方法→执行super(BStudent,self).__init__()语句→去父类中搜索__init__()方法→由于采用深度优先算法,所以先进入第一个参数BasketballMixin类中寻找__init__()

进入print 'skill'中

→调用__init__(self)方法→执行super(BasketballMixin,self).__init__()语句→去父类中搜索__init__()方法→由于采用深度优先算法,所以先进入第一个参数SkillMixin类中寻找__init__()

进入SkillMixin(object)中

→调用__init__(self)方法→执行print 'skill'语句→打印出skill

返回BasketballMixin(SkillMixin)中

执行语句print 'basketball'→打印出basketball→执行skill()方法,但没有输出

语句s = BStudent()执行完毕


因为已经在父类BasketballMixin()及其父类SkillMixin()中寻找到__init__()方法了,所以不再继续从父类Student()中寻找

你可以把BStudent(BasketballMixin,Student)换成BStudent(Student,BasketballMixin),看看结果是什么。


如果不理解深度优先算法执行顺序,可以自己跑一跑下面代码:

class P1:
    def foo(self):
        print('this is P1-foo()')
class P2:
    def foo(self):
        print('this is P2-foo()')
    def bar(self):
        print('this is P2-bar()')
class C1(P1,P2):
    pass
class C2(P1,P2):
    def foo(self):
        print('this is C2-foo()')
    def bar(self):
        print('this is C2-bar()')
        
class GC(C1,C2):
    pass

>>>gc=GC()

>>>gc.foo()

this is P1-foo()

>>>gc.bar()

this is P2-bar()

代码来自:Python编程基础

0 回复 有任何疑惑可以回复我~
#1

理Risen

有一行打错了,【进入print ‘skill’中】改为【进入BasketballMixin(SkillMixin)中】
2018-08-13 回复 有任何疑惑可以回复我~
#2

qq_染上空白_04172504 提问者 回复 理Risen

按照你说的,“寻找到__init__()方法了,所以不再继续从父类Student()中寻找”,那为什么本节的打印ABCD的代码为什么不是这样
2018-08-13 回复 有任何疑惑可以回复我~
#3

qq_染上空白_04172504 提问者 回复 理Risen

我懂了,课程里的代码是没有__init__()方法,所以还要查找
2018-08-13 回复 有任何疑惑可以回复我~
#4

理Risen 回复 qq_染上空白_04172504 提问者

( 我也是小白哈哈
2018-08-14 回复 有任何疑惑可以回复我~
#5

慕用6484265

skill()方法不会执行的吧 没调用怎么会执行
2018-12-24 回复 有任何疑惑可以回复我~
查看2条回复

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

将任务的代码改了一下,发现不是想要的结果

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信