类与类的继承关系
Posted wxl1025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类与类的继承关系相关的知识,希望对你有一定的参考价值。
1.单继承
1.从类名执行父类的属性
2.从对象执行父类的一切
注意: 子类以及子类对象只能调用父类的属性以及方法,不能操作(增删改)
# 既要执行父类方法又要执行子类方法,两种解决方式:
class Animal:
live = '有生命的'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print('动物都需要进食')
class Person(Animal):
def __init__(self,name, age, sex, hobby):
# 方法一:
Animal.__init__(self, name, age, sex)
# 方法二:
# super(Person, self).__init__(name, age, sex)
super().__init__(name, age, sex)
self.hobby = hobby
def eat(self):
print('人类需要进食')
super().eat()
p1 = Person('蔡徐坤', 21, '男','唱跳rap')
print(p1.__dict__)
p1.eat()
2.多继承
#多继承的难点就是继承顺序的问题
python2.2之前:都是经典类
python2.2直至python2.7之间存在两种类型: 经典类,新式类
python3x 只有新式类
经典类: 基类不继承object 查询规则依靠:深度优先的原则
新式类: 基类必须继承object 查询规则: mro算法
mro算法 面试中有可能会遇到
mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
表头:列表的第一个元素
表尾:列表中表头以外的元素集合(可以为空)
class O:
pass
class D(O):
pass
class E(O):
pass
class F(O):
pass
class B(D,E):
pass
class C(E,F):
pass
class A(B,C):
pass
a = A()
a.func()
mro(A) = mro(A(B,C))
= [A] + merge(mro(B), mro(C), [B,C])
mro(B) = mro(B(D,E))
= [B] + merge(mro(D), mro(E), [D,E])
= [B] + merge([D,O], [E,O], [D,E])
= [B,D] + merge([O], [E,O], [E])
= [B,D,E,O]
mro(C) = mro(C(E,F))
= [C] + merge(mro(E), mro(F),[E,F])
= [C] + merge([E,O],[F,O],[E,F])
= [C,E] + merge([O],[F,O],[F])
= [C,E,F,O]
mro(A) = mro(A(B,C))
= [A] + merge([B,D,E,O], [C,E,F,O], [B,C])
= [A,B] + merge([D,E,O], [C,E,F,O], [C])
= [A,B,D] + merge([E,O], [C,E,F,O], [C])
= [A,B,D,C] + merge([E,O], [E,F,O])
= [A,B,D,C,E] + merge([O], [F,O])
= [A,B,D,C,E,F,O]
=> print(A.mro())
以上是关于类与类的继承关系的主要内容,如果未能解决你的问题,请参考以下文章