Discuss / Python / 一个问题

一个问题

Topic source

class A(object): def f(self):
print('A') class B(object):
def f(self): print('B') class C(A,B): pass class D(A,B): pass class E(C,D): pass s= E() s.f()

为什么输出A

我个人分析是这样的:由于你继承顺序是A,B,程序在A中已经找到了方法f(),所以就执行了A,假如你换成继承顺序为B,A,那么就会执行B中的方法f()。

upbeat_peach

#3 Created at ... [Delete] [Delete and Lock User]

class Animal(object): pass class Mammal(Animal): pass class Bird(Animal): pass class RunnableMixIn(object): def run(self): print("Running~") class FlyableMixIn(object): def fly(self): print("Flying~") class Dog(Mammal,RunnableMixIn): pass class Bat(Mammal,RunnableMixIn): pass class Parrot(Bird,FlyableMixIn): pass class Ostrich(Bird,FlyableMixIn): pass

a=Dog() print(a.run())

然后输出的是 Running~~~ None

为什么会多个none啊?

关于python多重继承的理解,首先对于单继承来说,子类继承了父类的行为特征,也就是方法,但是如果子类没有对父类的方法重写,那么子类实例调用该方法实际是调用了父类的方法,如果子类对父类的方法重写了,那么子类的实例调用该方法就是调用子类的方法。也就是子类实例调用继承的方法是,优先级是:子类的方法、基类的方法。可想而知,当多重继承时,难道后面的基类的优先级比前面的要高吗?

这里涉及到python多重继承执行先后顺序,java是单继承,B继承A,A继承obj类,如果B类实例对象调用某个方法或属性,会优先去子类B类在去A类,再去Ojb类找。

python是多继承,你这个例子中,E类会先去C类找,没找到去D类,再没找到就像上一级父类A中找,A类没找到,就去B类,这一级没找到会再向上一级父类Object类 ,你这里A类中已经找到了,自然就是执行A类中的打印方法f(),而不会再去接着向下查找,明白了吗,你把B类中的f()方法改成f1()试试,打印的应该就是B类中的f1()方法了。 你可以去搜一下python经典类和新式类,你应该就可以明白了

天命破凰

#6 Created at ... [Delete] [Delete and Lock User]

你这个是因为属性名重复了 class A(object): def f(self): print('A') class B(object): def e(self): print('B') class C(A,B): pass class D(A,B): pass class E(C,D): pass 此时E类两种属性都有

Running~~~ 应该是a.run()执行过程的输出 None应该是a.run()的执行结果,因为run()里没有return,如果定义了return应该就不会是None了

zhu_weimin123

#8 Created at ... [Delete] [Delete and Lock User]

确实如果C,改成B在前,就打印B。 但有点奇怪的是,如果C,D是同样的多继承A,B但顺序不一样。比如C(A,B),D(B,A) E就会报错。为什么呢?


  • 1

Reply