'''
⽬标
继承的概念
单继承
多继承
⼦类重写⽗类的同名属性和⽅法
⼦类调⽤⽗类的同名属性和⽅法
多层继承
super()
私有属性和私有⽅法
'''
'''
Python⾯向对象的继承指的是多个类之间的所属关系,即⼦类默认继承⽗类的所有属性和⽅法,
具体如下:
'''
# ⽗类A
class A(object):
def __init__(self):
self.num = 1
def info_print(self):
print(self.num)
# ⼦类B
class B(A):
pass
print('------------------------------------')
result = B()
result.info_print() # 1
# 在Python中,所有类默认继承object类,object类是顶级类或基类;其他⼦类叫做派⽣类。
'''
⼆. 单继承
故事主线:⼀个煎饼果⼦⽼师傅,在煎饼果⼦界摸爬滚打多年,研发了⼀套精湛的摊煎饼果⼦的
技术。师⽗要把这套技术传授给他的唯⼀的最得意的徒弟。
分析:徒弟是不是要继承师⽗的所有技术?
'''
# 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()
print('------------------------------------')
print('------------------------------------')
print('------------------------------------')
'''
三. 多继承
故事推进:daqiu是个爱学习的好孩⼦,想学习更多的煎饼果⼦技术,于是,在百度搜索,报班学习煎饼果⼦技术。
所谓多继承意思就是⼀个类同时继承了多个⽗类。
'''
# 创建学校类
class School(object):
def __init__(self):
self.kongfu = '[报班学习秘制配方]'
def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子')
class Prentice2(School, Master):
pass
daqiu2 = Prentice2()
print(daqiu2.kongfu)
daqiu2.make_cake()
# 注意:当⼀个类有多个⽗类的时候,默认使⽤第⼀个⽗类的同名属性和⽅法。
print('------------------------------------')
print('------------------------------------')
print('------------------------------------')
'''
四. ⼦类重写⽗类同名⽅法和属性
故事:daqiu掌握了师⽗和培训的技术后,⾃⼰潜⼼钻研出⾃⼰的独⻔配⽅的⼀套
全新的煎饼果⼦技术。
'''
class Prentice3(School, Master):
def __init__(self):
self.kongfu = '[独创煎饼果子配方]'
def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子')
daqiu3 = Prentice3()
print(daqiu3.kongfu)
daqiu3.make_cake()
print(Prentice3.__mro__)
# ⼦类和⽗类具有同名属性和⽅法,默认使⽤⼦类的同名属性和⽅法。
print('------------------------------------')
print('------------------------------------')
print('------------------------------------')
'''
五. ⼦类调⽤⽗类的同名⽅法和属性
故事:很多顾客都希望也能吃到古法和报班学习的技术的煎饼果⼦。
'''
class Prentice4(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)
daqiu4 = Prentice4()
daqiu4.make_cake()
daqiu4.make_master_cake()
daqiu4.make_school_cake()
daqiu4.make_cake()
print('------------------------------------')
print('------------------------------------')
print('------------------------------------')
'''
六. 多层继承
故事:N年后,daqiu⽼了,想要把所有技术传承给⾃⼰的徒弟。
'''
class Prentice5(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)
class Tusun(Prentice5):
"""徒孙类"""
pass
xiaoqiu = Tusun()
xiaoqiu.make_cake()
xiaoqiu.make_school_cake()
xiaoqiu.make_master_cake()
print('------------------------------------')
print('------------------------------------')
print('------------------------------------')
# 七. super()调⽤⽗类⽅法
class School2(Master):
def __init__(self):
self.kongfu = '[⿊⻢煎饼果⼦配⽅]'
def make_cake(self):
print(f'运⽤{self.kongfu}制作煎饼果⼦')
# ⽅法2.1
# super(School, self).__init__()
# super(School, self).make_cake()
# ⽅法2.2
super().__init__()
super().make_cake()
class Prentice6(School2):
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):
School2.__init__(self)
School2.make_cake(self)
# ⼀次性调⽤⽗类的同名属性和⽅法
def make_old_cake(self):
# ⽅法⼀:代码冗余;⽗类类名如果变化,这⾥代码需要频繁修改
# Master.__init__(self)
# Master.make_cake(self)
# School.__init__(self)
# School.make_cake(self)
# ⽅法⼆: super()
# ⽅法2.1 super(当前类名, self).函数()
# super(Prentice, self).__init__()
# super(Prentice, self).make_cake()
# ⽅法2.2 super().函数()
super().__init__()
super().make_cake()
daqiu6 = Prentice6()
daqiu6.make_old_cake()
# 注意:使⽤super()可以⾃动查找⽗类.调⽤顺序遵循__mro__类属性的顺序.⽐较适合单继承使⽤
'''
⼋. 私有权限
8.1 定义私有属性和⽅法
在Python中,可以为实例属性和⽅法设置私有权限,即设置某个实例属性或实例⽅法不继承给⼦类。
故事:daqiu把技术传承给徒弟的同时,不想把⾃⼰的钱(2000000个亿)继承给徒弟,这个时候就
要为 钱 这个实例属性设置私有权限。
设置私有权限的⽅法:在属性名和⽅法名 前⾯ 加上两个下划线 __。
'''
class Prentice7(School, Master):
def __init__(self):
self.kongfu = '[独创煎饼果⼦配⽅]'
# 定义私有属性
self.__money = 2000000
# 定义私有⽅法
def __info_print(self):
print(self.kongfu)
print(self.__money)
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)
# 徒孙类
class Tusun2(Prentice7):
pass
daqiu = Prentice7()
# 对象不能访问私有属性和私有⽅法
# print(daqiu.__money)
# daqiu.__info_print()
xiaoqiu = Tusun2()
# ⼦类⽆法继承⽗类的私有属性和私有⽅法
# print(xiaoqiu.__money) # ⽆法访问实例属性__money
# xiaoqiu.__info_print()
# 注意:私有属性和私有⽅法只能在类⾥⾯访问和修改。
'''
8.2 获取和修改私有属性值
在Python中,⼀般定义函数名 get_xx ⽤来获取私有属性,定义 set_xx ⽤来修改私有属性值。
'''
class Prentice8(School, Master):
def __init__(self):
self.kongfu = '[独创煎饼果⼦配⽅]'
self.__money = 2000000
# 获取私有属性
def get_money(self):
return self.__money
# 修改私有属性
def set_money(self):
self.__money = 500
def __info_print(self):
print(self.kongfu)
print(self.__money)
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)
# 徒孙类
class Tusun3(Prentice8):
pass
daqiu8 = Prentice8()
xiaoqiu8 = Tusun3()
# 调⽤get_money函数获取私有属性money的值
print(xiaoqiu8.get_money())
# 调⽤set_money函数修改私有属性money的值
xiaoqiu8.set_money()
print(xiaoqiu8.get_money())
'''
九. 总结
继承的特点
⼦类默认拥有⽗类的所有属性和⽅法
⼦类重写⽗类同名⽅法和属性
⼦类调⽤⽗类同名⽅法和属性
super()⽅法快速调⽤⽗类⽅法
私有权限
不能继承给⼦类的属性和⽅法需要添加私有权限
语法
class 类名():
# 私有属性
__属性名 = 值
# 私有⽅法
def __函数名(self):
代码
'''
Python面向对象-继承
最新推荐文章于 2024-04-30 17:28:01 发布