一、继承
语法:
class 类名(object):
代码
Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法。在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。
1.1 单继承
单继承:一对一,子类对父类的继承。
# 1. 师父类
class Master(object):
def __init__(self):
self.kongfu = '[独门拳法]'
def make_cake(self):
print(f'运⽤{self.kongfu}进行比武')
# 2. 徒弟类
class Prentice(Master):
pass
# 3. 创建对象
daqiu daqiu = Prentice()
# 4. 对象访问实例属性
print(daqiu.kongfu)
# 5. 对象调⽤用实例方法
daqiu.make_cake()
1.2 多继承
多继承意思就是一个类同时继承了多个父类。
# 父类
class Master(object):
def __init__(self):
self.kongfu = '[独门拳法]'
def make_cake(self):
print(f'运用{self.kongfu}进行比武')
# 为了验证多继承,创建学校类
class School(object):
def __init__(self):
self.kongfu = '[武林第一拳法]'
def make_cake(self):
print(f'运用{self.kongfu}进行比武')
# 定义子类,继承两个父类
class Prentice(School, Master):
pass
# 用徒弟类创建对象,调用实例属性和方法
daqiu = Prentice()
print(daqiu.kongfu)
daqiu.make_cake()
# 结论:如果一个子类继承多个父类,优先继承第一个父类的属性和方法。
1.3 子类重写父类同名方法和属性
# 父类
class Master(object):
def __init__(self):
self.kongfu = '[独门拳法]'
def make_cake(self):
print(f'运用{self.kongfu}进行比武')
# 为了验证多继承,创建学校类
class School(object):
def __init__(self):
self.kongfu = '[武林第一拳法]'
def make_cake(self):
print(f'运用{self.kongfu}进行比武')
# 独创配方
class Prentice(School, Master):
def __init__(self):
self.kongfu = '[独创武术]'
def make_cake(self):
print(f'运用{self.kongfu}进行比武')
# 用徒弟类创建对象,调用实例属性和方法
daqiu = Prentice()
print(daqiu.kongfu)
daqiu.make_cake()
print(Prentice.__mro__)
子类和父类具有同名属性和方法,默认使用子类的同名属性和方法。
1.4 子类调用父类的同名方法和属性
class Master(object):
def __init__(self):
self.kongfu = '[独门拳法]'
def make_cake(self):
print(f'运用{self.kongfu}进行比武')
class School(object):
def __init__(self):
self.kongfu = '[武林第一拳法]'
def make_cake(self):
print(f'运用{self.kongfu}进行比武')
class Prentice(School, Master):
def __init__(self):
self.kongfu = '[独创拳法]'
def make_cake(self):
# 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化。 self.__init__()
print(f'运用{self.kongfu}进行比武')
# 调用父类方法,但是为保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化。
def make_master_cake(self):
Master.__init__(self)
Master.make_cake(self)
def make_school_cake(self):
School.__init__(self)
School.make_cake(self)
daqiu = Prentice()
daqiu.make_cake()
daqiu.make_master_cake()
daqiu.make_school_cake()
daqiu.make_cake()
1.5 super()调用父类方法
使用super() 可以自动查找父类。调用顺序遵循 __mro__ 类属性的顺序。比较适合单继承使用。
1.6 总结
继承的特点:
- 子类默认拥有父类的所有属性和方法
- 子类重写父类同名方法和属性
- 子类调用父类同名方法和属性
- super()快速调用父类方法