1、体验继承
Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法,具体如下:
代码演示
# 继承:子类默认继承父类的所有属性和方法
# 1、定义父类
class A(object):
def __init__(self):
self.num = 1
def info_print(self):
print(self.num)
# 2、定义子类,继承父类
class B(A):
pass
# 3、创建对象,验证结论
result = B()
result.info_print()
运行结果
1
:在Python中,所有类默认继承object类,object类是顶级类或基类;其它子类叫做派生类
2、单继承
故事主线:
一个煎饼果子老师傅,在煎饼果子界摸爬滚打好多年,研发了一套精湛的摊煎饼果子的技术。师傅把这套技术传给他的得意门徒“大秋”。
代码演示
# 1、师傅类,属性和方法
class Master(object):
def __init__(self):
self.kongfu = '[古法煎饼果子配方]'
def make_cake(self):
print(f'{self.kongfu}制作煎饼果子')
# 2、定义徒弟类,继承师傅类
class Prentice(Master):
pass
# 3、用徒弟类创建对象,调用实例属性和方法
# 创建对象
daqiu = Prentice()
# 对象访问实例属性
print(daqiu.kongfu)
daqiu.make_cake()
运行结果
[古法煎饼果子配方]
[古法煎饼果子配方]制作煎饼果子
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): # 如果一个类能继承多个父类,优先继承第一类的同名属性和方法
pass
# 用徒弟类创建对象,调用实例属性和方法
daqiu = Prentice()
print(daqiu.kongfu)
daqiu.make_cake()
运行结果
[黑马煎饼果子配方]
运用[黑马煎饼果子配方]制作煎饼果子
:如果一个类能继承多个父类,优先继承第一类的同名属性和方法
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):
print(f'运用{self.kongfu}制作煎饼果子')
# 用徒弟类创建对象,调用实例属性和方法
daqiu = Prentice()
print(daqiu.kongfu)
daqiu.make_cake()
print(Prentice.__mro__) # 打印类的层级继承顺序
运行结果
[独创煎饼果子配方]
运用[独创煎饼果子配方]制作煎饼果子
(, , , )
:__ mro __查看某个类的继承关系
5、子类调用父类同名属性和方法
故事主线:
很多顾客希望也能吃到古法和黑马技术的煎饼果子
代码演示
# 定义师傅类
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):
# 如果不加自己初始化,导致kongfu属性值是上一次调用的init内的kongfu属性值
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子')
# 子类调用父类的同名方法和属性:把父类的同名属性和方法再次封装
def make_master_cake(self):
# 父类类名.函数()
# 再次调用初始化的原因;这是想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用init
Master.__init__(self)
Master.make_cake(self)
def make_school_cake(self):
School.__init__(self)
School.make_cake(self)
daqiu = Prentice()
# print(daqiu.kongfu)
daqiu.make_cake()
daqiu.make_master_cake()
daqiu.make_school_cake()
daqiu.make_cake()
运行结果
运用[独创煎饼果子配方]制作煎饼果子
运用[古法煎饼果子配方]制作煎饼果子
运用[黑马煎饼果子配方]制作煎饼果子
运用[独创煎饼果子配方]制作煎饼果子
6、多层继承
故事主线:
多年后,大秋老了,想把所有的技术传承给自己徒弟。
代码演示
# 定义师傅类
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):
# 如果不加自己初始化,导致kongfu属性值是上一次调用的init内的kongfu属性值
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子')
# 子类调用父类的同名方法和属性:把父类的同名属性和方法再次封装
def make_master_cake(self):
# 父类类名.函数()
# 再次调用初始化的原因;这是想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用init
Master.__init__(self)
Master.make_cake(self)
def make_school_cake(self):
School.__init__(self)
School.make_cake(self)
# 步骤:1、创建类Tusun,用这个了类创建对象;2、用这个对象调用父类竖向或方法
# 徒孙类
class Tusun(Prentice):
pass
xiaoqiu = Tusun()
xiaoqiu.make_cake()
xiaoqiu.make_master_cake()
xiaoqiu.make_school_cake()
运行结果
运用[独创煎饼果子配方]制作煎饼果子
运用[古法煎饼果子配方]制作煎饼果子
运用[黑马煎饼果子配方]制作煎饼果子
7、super()调用父类方法
代码演示
# 定义师傅类
class Master(object):
def __init__(self):
self.kongfu = '[古法煎饼果子配方]'
def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子')
# 创建学校类
class School(Master):
def __init__(self):
self.kongfu = '[黑马煎饼果子配方]'
def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子')
# 2.1 super()带参数写法
# super(School,self).__init__()
# super(School,self).make_cake()
# 2.2无参数的super
super().__init__()
super().make_cake()
# 定义徒弟类
# 独创配方
class Prentice(School):
def __init__(self):
self.kongfu = '[独创煎饼果子配方]'
def make_cake(self):
# 如果不加自己初始化,导致kongfu属性值是上一次调用的init内的kongfu属性值
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子')
# 子类调用父类的同名方法和属性:把父类的同名属性和方法再次封装
def make_master_cake(self):
# 父类类名.函数()
# 再次调用初始化的原因;这是想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用init
Master.__init__(self)
Master.make_cake(self)
def make_school_cake(self):
School.__init__(self)
School.make_cake(self)
# 需求:一次性调用父类School Master的方法
def make_old_cake(self):
# 方法1:如果定义的类名修改,此处也要修改,代码量庞大,冗余
# School.__init__(self)
# School.make_cake(self)
# Master.__init__(self)
# Master.make_cake(self)
# 方法2:super()
# 2.1:super(当前类名,self).函数()
# super(Prentice, self).__init__()
# super(Prentice, self).make_cake()
# 2.2 无参数super
super().__init__()
super().make_cake()
daqiu = Prentice()
daqiu.make_old_cake()
运行结果
运用[黑马煎饼果子配方]制作煎饼果子
运用[古法煎饼果子配方]制作煎饼果子