2021/1/17 类的继承(python)
类的继承
B 继承 A类,B就叫做A的子类,派生类,A叫做 B的父类,基类,超类,B类以及B类的对象
使用A类所有的属性及方法
当未引入类的继承关系时:
# 人类 class Person(): def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex # 狗类 class Dog(): def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex # 猫类 class Cat: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex
这样写代码有很多重复的地方,代码冗余
引入继承概念后
继承的优点
1.节省代码
2.增强的耦合性
3.代码规范化
子类又被称为子类,派生类。父类又被称为基类,超类。
继承分类:
单继承,及继承的特点
# 1.子类可以调用父类所有的属性及方法 class Animal: live = '有生命的' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def eat(self): print(f'self---->{self}') print('动物需要进食') class Person(Animal): pass class Dog(Animal): pass class Cat: pass p1 = Person('ping', 99, 'boy') print(p1.live) p1.eat() print(f'p1--->{p1}') """打印结果: 有生命的 self----><__main__.Person object at 0x00000248DD554668> 动物需要进食 p1---><__main__.Person object at 0x00000248DD554668> """ # 2.子类以及子类对象只能调用父类的属性以及方法,不能操作(增删改),当类中是可变数据类型,通过数据添加,可以改变数据,原理参考函数的浅拷贝 class Animal: live = '有生命的' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def eat(self): print(f'self---->{self}') print('动物需要进食') class Person(Animal): pass class Dog(Animal): pass class Cat: pass p1 = Person('ping', 99, 'boy') print(p1.live) p1.live = 'xxx' print(p1.live) print(Animal.__dict__['live']) """打印结果: 有生命的 xxx 有生命的 """ #当子类将父类的方法覆盖了,(重写父类的方法) class Animal: live = '有生命的' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def eat(self): print(f'self---->{self}') print('动物需要进食') class Person(Animal): def eat(self): print('人类需要进食') class Dog(Animal): pass class Cat: pass p1 = Person('ping', 99, 'boy') # # 子类将父类的方法覆盖了,(重写父类的方法) p1.eat() #对象查找顺序先从对象空间找名字---->子类找名字------>父类找名字 """打印结果: 人类需要进食 """ #子类调用父类的方法 class Animal: live = '有生命的' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def eat(self): print(f'self---->{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): super().eat() print('人类需要进食') class Dog(Animal): pass class Cat: pass p1 = Person('ping', 99, 'boy', '11') print(p1.__dict__) p1.eat() """执行结果: {'name': 'ping', 'age': 99, 'sex': 'boy', 'hobby': '11'} self----><__main__.Person object at 0x000001A181AE4860> 动物需要进食 人类需要进食 """
多继承
多继承的继承特性与单继承一样,但是多继承需要考虑继承查询的顺序:
经典类查询的顺序:

新式类继承顺序:
""" 多继承 继承顺序问题: python2.2之前,都是经典类,python2.2直至python2.7之间存在两种类型:经典类,新式类。 python3x只有新式类 经典类:基类不继承object,查询规则依靠:深度优先原则 新式类:基类必须继承object,查询规则依靠:mro算法, mro(Child(Base1, Base2) = [ Child ] + merge( mro(Base1), mro(Base2, [ Base1, Base2 ]) 表头(列表第一个元素)表尾(表头以外的元素集合,可以为空) [A , B, C] : 表头:A 表尾:[B, C] """ 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() """ mro算法多继承算法: 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] mor(A) = [A] + merge(mro(B), mro(C), [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] """

浙公网安备 33010602011771号