1.程序中的继承
- 在程序中,继承描述的是多个类之间的所属关系;
- 如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里,那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。
示例代码如下:
# 定义父类A
class A(object):
# 定义构造方法
def __init__(self):
self.num = 10
# 实例化方法
def print_num(self):
print(self.num + 10)
# 定义一个子类B
class B(A):
pass
# 实例化对象b
b = B()
print(b.num)
b.print_num()
输出结果如下:
10
20
2.单继承
单继承:子类只继承一个父类 。
- 子类在继承的时候,在定义类时,小括号()中为父类的名字;
- 父类的属性、方法,会被继承给子类
示例代码如下:
# 定义一个Master类
class Master(object):
def __init__(self):
# 属性
self.formula = "古法煎饼果子配方"
# 实例方法
def make_cake(self):
print("按照{}制作煎饼果子".format(self.formula))
# 定义一个子类Prentice,继承父类Master,子类可以继承父类中所有的属性和方法
class Prentice(Master):
pass
# 实例化一个父类对象allan
allan = Master()
print(allan.formula)
allan.make_cake()
print("***" * 10)
# 实例化一个子类对象crystal
crystal = Prentice()
# 子类对象crystal可以直接使用父类的属性
print(crystal.formula)
# 子类对象crystal可以直接使用父类的方法
crystal.make_cake()
输出结果如下:
古法煎饼果子配方
按照古法煎饼果子配方制作煎饼果子
******************************
古法煎饼果子配方
按照古法煎饼果子配方制作煎饼果子
3.多继承
多继承:子类继承多个父类。
- 多继承可以继承多个父类,也继承了所有父类的属性和方法;
- 如果多个父类中有同名的属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性__mro__的顺序来查找)
示例代码如下:
# 定义一个Master类
class Master(object):
def __init__(self):
# 属性
self.formula = "古法煎饼果子配方"
# 实例方法
def make_cake(self):
print("[古法]按照{}制作煎饼果子".format(self.formula))
# 定义一个School类
class School(object):
def __init__(self):
# 属性
self.formula = "现代煎饼果子配方"
# 实例方法
def make_cake(self):
print("[现代]按照{}制作煎饼果子".format(self.formula))
# 定义一个子类Prentice,继承两个父类Master和School,子类可以继承父类中的所有属性和方法
# 如果父类中有同名的属性和方法,则默认使用第一个父类的属性和方法
class Prentice(Master, School):
pass
# 实例化一个子类对象crystal,默认使用的是Master类的属性和方法
crystal = Prentice()
# 使用的是Master的属性
print(crystal.formula)
# 调用的是Master的方法
crystal.make_cake()
# 子类的魔法属性__mro__决定了属性和方法的查找顺序
print(Prentice.__mro__)
输出结果如下:
古法煎饼果子配方
[古法]按照古法煎饼果子配方制作煎饼果子
(<class '__main__.Prentice'>, <class '__main__.Master'>, <class '__main__.School'>, <class 'object'>)
4.子类重写父类的同名属性和方法
子类重写父类的同名属性和方法,则默认使用子类的属性和方法。
示例代码如下:
# 定义一个Master类
class Master(object):
def __init__(self):
# 属性
self.formula = "古法煎饼果子配方"
# 实例方法
def make_cake(self):
print("[古法]按照{}制作煎饼果子".format(self.formula))
# 定义一个School类
class School(object):
def __init__(self):
# 属性
self.formula = "现代煎饼果子配方"
# 实例方法
def make_cake(self):
print("[现代]按照{}制作煎饼果子".format(self.formula))
# 定义一个子类Prentice,继承两个父类Master和School
class Prentice(Master, School):
def __init__(self):
# 子类重写formula属性
self.formula = "猫氏煎饼果子配方"
# 子类重写make_cake()方法
def make_cake(self):
print("[猫氏]按照{}制作煎饼果子".format(self.formula))
# 实例化一个子类对象crystal
# 子类重写父类同名的属性和方法,则默认使用子类的属性和方法
crystal = Prentice()
print(crystal.formula)
crystal.make_cake()
# 子类的魔法属性__mro__决定了属性和方法的查找顺序
print(Prentice.__mro__)
输出结果如下:
猫氏煎饼果子配方
[猫氏]按照猫氏煎饼果子配方制作煎饼果子
(<class '__main__.Prentice'>, <class '__main__.Master'>, <class '__main__.School'>, <class 'object'>)
5.子类调用父类的同名属性和方法
示例代码如下:
# 定义一个Master类
class Master(object):
def make_cake(self):
print("按照[古法]制作煎饼果子")
# 定义一个School类
class School(object):
def make_cake(self):
print("按照[现代]制作煎饼果子")
# 定义一个子类Prentice,继承了两个父类Master和School
class Prentice(Master, School):
def make_cake(self):
print("按照[猫氏]制作煎饼果子")
def make_old_cake(self):
Master.make_cake(self)
def make_new_cake(self):
School.make_cake(self)
# 实例化一个子类对象crystal
crystal = Prentice()
crystal.make_cake()
print("**" * 10)
crystal.make_old_cake()
print("**" * 10)
crystal.make_new_cake()
输出结果如下:
按照[猫氏]制作煎饼果子
********************
按照[古法]制作煎饼果子
********************
按照[现代]制作煎饼果子
6.super()的使用
使用super()可以逐一调用所有的父类方法,并且只执行一次。
示例代码如下:
# 定义一个Master类
class Master(object):
def make_cake(self):
print("按照[古法]制作煎饼果子")
# 定义一个School类,继承父类Master
class School(Master):
def make_cake(self):
print("按照[现代]制作煎饼果子")
super().make_cake()
# 定义一个子类Prentice,继承了两个父类Master和School
class Prentice(School, Master):
def make_cake(self):
print("按照[猫氏]制作煎饼果子")
super().make_cake()
# 实例化一个子类对象crystal
crystal = Prentice()
crystal.make_cake()
输出结果如下:
按照[猫氏]制作煎饼果子
按照[现代]制作煎饼果子
按照[古法]制作煎饼果子