一、继承
概述:
实际开发中,我们发现很多类中的步分内容是相似的,或者相同的,每次写很麻烦,针对这种情况, 我们可以把这些相似(相同的)部分抽取出来,单独地放到1个类中(父类), 然后让多个类(子类)和这个类产生关系,这个关系就叫:继承。
通俗解释:
子承父业,Python中的继承,子类=>继承父类的 属性,行为。
格式:
class 子类名(父类名):
pass
优点:
1.提高代码的复用性; 2.提高代码的可维护性。
缺点:
耦合性增强了,好坏都继承了过来。
耦合:指的是类与类之间的关系
细节:
1.所有的类都直接或间接继承自object,它是所有类的父类,也叫:顶级类
'''
继承相关概述:
概述:
实际开发中,我们发现很多类中的步分内容是相似的,或者相同的,每次写很麻烦,针对这种情况,
我们可以把这些相似(相同的)部分抽取出来,单独地放到1个类中(父类),
然后让多个类(子类)和这个类产生关系,这个关系就叫:继承
通俗解释:
子承父业,Python中的继承,子类=>继承父类的 属性,行为
格式:
class 子类名(父类名):
pass
优点:
1.提高代码的复用性;
2.提高代码的可维护性。
缺点:
耦合性增强了,好坏都继承了过来
耦合:指的是类与类之间的关系
细节:
1.所有的类都直接或间接继承自object,它是所有类的父类,也叫:顶级类
'''
class Father:
def __init__(self):
self.gender='男'
def walk(self):
print('饭后走一走,能活九十九!')
class Son(Father):
pass
if __name__ == '__main__':
s=Son()
print(f'gender:{s.gender}')
s.walk()
print(type(s.walk))
运行结果:
二、多继承
1. Python中支持多继承写法, 即: 1个类可以有多个父类。
写法为: class 子类名(父类名1, 父类名2...)
2. 多继承关系中, 子类可以继承所有父类的属性和行为. 前提: 父类的私有成员除外.
3. 多继承关系中, 多个父类如果有重名属性或者方法时, 子类会优先使用第1个父类(即: 最前边的父类)的该成员.
4. 上述的继承关系, 我们可以通过 Python内置的 mro属性 或者 mro()方法来查看.
mro: Method Resolution Order, 即: 方法的解析顺序(调用顺序)
class Master(object):
# 1.1 定义父类的 属性.
def __init__(self):
self.kongfu = '[古法煎饼果子配方]'
self.name = 'Master'
# 1.2 定义父类的 行为, 表示: 摊煎饼.
def make_cake(self):
print(f'使用 {self.kongfu} 制作煎饼果子')
# 2. 创建1个师傅类, 充当父类.
class School(object):
# 2.1 定义父类的 属性.
def __init__(self):
self.kongfu = '[黑马AI煎饼果子配方]'
# 2.2 定义父类的 行为, 表示: 摊煎饼.
def make_cake(self):
print(f'使用 {self.kongfu} 制作煎饼果子')
# 3. 定义徒弟类, 继承自师傅类.
class Prentice(School, Master):
pass
# 在main函数中测试
if __name__ == '__main__':
# 4. 创建子类的对象
p = Prentice()
# 5. 尝试打印 p对象的 属性 和 行为
print(f'从父类继承的属性: {p.kongfu}')
p.make_cake() # 从父类继承来的行为.
print('-' * 21)
# 6. 演示方法的解析顺序, 即: MRO, 看看方法优先会从哪些类中找.
print(Prentice.__mro__) # 输出: Prentice > School > Master > object, 封装成: 元组
print(Prentice.mro()) # 输出: Prentice > School > Master > object, 封装成: 列表
运行结果:
三、重写
概述:
子类出现和父类重名的属性, 方法时, 会覆盖父类中的成员, 这种写法就称之为: 重写, 也叫: 覆盖.
注意: 重写一般特指: 方法重写.
应用场景:
当子类需要沿袭父类的功能, 而功能主体又有自己额外需求的时候, 就可以考虑使用方法重写了.
细节:
1. 子类有和父类重名的属性和方法时, 优先使用 子类的成员. 就近原则.