一个问题
Topic sourceclass 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经典类和新式类,你应该就可以明白了
你这个是因为属性名重复了 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类两种属性都有
- 1
用户6878165384
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