继承,体现类的可扩展性,实现代码重用,相同的代码不需要重复编写
![](https://img.haomeiwen.com/i15420318/bf276e617cde336a.png)
单继承
class 类名(父类名):
pass
- 子类可以
继承
父类,直接使用父类中的公有属性和方法- 子类不能直接访问父类的私有属性,只能通过父类的
get/set
方法访问- 子类可以增加
特有的
属性和方法
- 方法的重写
- 当
父类
的方法实现不能满足子类需求时,可以对方法进行重写(override)
- 在子类中定义了一个和父类
同名的方法
并且实现,在运行时就会调用子类中重写的方法,而不会调用父类的方法- 因为Python中没有方法重载,所以重写时不存在父类方法重名问题
class Parent: # 定义父类
def myMethod(self):
print ('调用父类方法')
class Child(Parent): # 定义子类
def myMethod(self):
print ('调用子类方法')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
调用子类方法
- super方法
在继承条件下,如果要调用父类的方法,可以使用
super
方法
super( ).__init__( 父类属性 )
子类对象的初始化属性原则是:
- 子类
新增的
属性由子类初始化
继承来的
属性调用父类的__init__
方法来初始化
class Base:
def __init__(self, basename):
self.basename = basename
class Sub(Base):
def __init__(self, basename, subname):
super().__init__(basename) # 不能使用 super().basename = basename
self.subname = subname
- 在类
内
使用super(子类名, self).父类方法名()
的形式调用父类方法- 在类
外
使用super(子类名, 子类对象).父类方法名()
的形式调用父类方法
class Base:
def base_func(self):
print('base_func()')
class Sub(Base):
pass
if __name__ == '__main__':
s = Sub()
super(Sub, s).base_func()
多继承
子类可以拥有
多个父类
,并且具有所有父类
的属性和方法
class 子类名( 父类名1, 父类名2 ... )
pass
- 如果多个父类存在同名的属性或方法,应该
避免
使用多继承- Python中提供了一个内置属性
__mro__
,用来查看方法的搜索顺序MRO (method resolution order)
,用于判断多继承时方法、属性的调用顺序- 搜索时,是按照
__mro__
从左至右顺序查找,如果在当前类中找到方法,就直接执行,不再搜索- 如果没有找到,就查找下一个类中是否有对应的方法,如果找到就直接执行,不再搜索
- 如果找到最后一个类,还没有找到方法,程序报错
- end -
网友评论