一、继承
在实际开发中,我们会遇到很多相同或相类似的对象,它们之间的代码主体相似,我们可以将相似或相同的部分书写成一个基类,其他类就可以继承基类的代码以减少重复代码量
1.1 单继承
class Parent:
name = "Jone"
class Son(Parent):
pass
son = Son()
print(son.name) # 继承自父类. 输出 Jone
print(id(Parent.name), id(Son.name)) # 输出 2258624363248 2258624363248
Parent
类: 是被继承的类, 称为父类Son
类: 继承Parent
的类, 称为子类- 继承发生后, 子类会获得父类的所用属性和方法
- 子类继承父类的属性与父类属性是统一个对象.
1.2 多继承
class A:
pass
class B:
pass
class C(A, B):
pass
print(C.mro()) # 输出 [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
- 当一个类要继承多个类的时候, 每一个类使用逗号(
,
)进行分隔 - 会按照书写顺序进行继承
ClassName.mro()
: 查看继承顺序(C3算法实现), 也是属性和方法的搜索顺序, 先继承先搜索.
每一个类都会继承一个基类object
被继承的类还有继承, 也即是多重继承
class A:
pass
class B:
pass
class C(A): # C继承A
pass
class D(B): # D继承B
pass
class E(C, D): # E先继承C(C继承A); 再继承D(D继承B)
pass
print(E.mro()) # [<class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.D'>, <class '__main__.B'>, <class 'object'>]
1.3 菱形继承
class GrandParent:
pass
class Father(GrandParent):
pass
class Mother(GrandParent):
pass
class Son(Father, Mother):
pass
print(Son.mro()) # [<class '__main__.Son'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class '__main__.GrandParent'>, <class 'object'>]
1.4 继承顺序
按照父类--父类的父类的顺序依次进行继承
二、重写
对于从同一个父类继承而来的代码是一摸一样的,但是对于不同的类有些代码必须进行修改。
我们在继承父类的属性和方法之后,如果想对继承的属性和方法的内容进行修改,可以将该方法在子类重新写一次,这个就是重写
class Animal:
def eat(self):
print("吃东西")
def work(self):
print("走路")
class Cat(Animal):
def eat(self): # 重写父类的eat方法
print("小猫吃东西")
def work(self): # 重写父类的work方法
print("小猫走直线")
cat = Cat()
cat.eat()
cat.work()