python进阶,在第一期的基础上做了极大的优化,整体更加美观易懂
内容较多(该篇幅超过4000字),分为上下两个篇幅,此篇是下
十九、继承 (下)
19.2、多层继承
多层继承.新增一个类
class Fath_1(object):
def __init__(self):
self.back_fatc = "张三的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学走了")
class Fath_2(object):
def __init__(self):
self.back_fatc = "张三徒弟的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学会了")
class Su(Fath_1, Fath_2): # 有几个父类加几个父类,(同名情况下)哪一个父类在前子类就优先继承哪一个父类
def __init__(self):
self.back_fatc = "自创的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学会了")
def make_fath_1(self): # 把父类的同名属性和方法再次封装
# 方法:父类类名.函数名
Fath_1.__init__(self)
Fath_1.zi_0(self)
# print(self)
def make_fath_2(self): # 把父类的同名属性和方法再次封装
# 方法:父类类名.函数名
Fath_2.__init__(self) # 如果不加init方法,优先去使用子类中的同名属性
Fath_1.zi_0(self) # 如果想要把wangwu这个对象去调用这个同名方法,就需要把对象的引用(self)传入
# print(self)
# 多层继承
class Duocen(Fath_1):
pass
chenliu = Su()
chenliu.zi_0()
chenliu.make_fath_1()
chenliu.make_fath_2()
# 结果:
>>> 自创的拿手手艺我学会了
>>> 张三的拿手手艺我学走了
>>> 张三徒弟的拿手手艺我学走了
所谓的多层继承就是你继承给我,我继承给他
19.3、super()
super():调用父类方法
作用:简化调用父类方法的代码
注意:使用super()可以自动查找父类,调用顺序遵循__mro__类属性的顺序,比较适合单继承使用
19.3.1、super() 有参
class Fath_1(object):
def __init__(self):
self.back_fatc = "张三的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学走了")
class Fath_2(Fath_1):
def __init__(self):
self.back_fatc = "张三徒弟的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学会了")
# 有参——>super(当前类名, self).函数()
super(Fath_2, self).__init__()
super(Fath_2, self).zi_0()
class Su(Fath_2): # 有几个父类加几个父类,(同名情况下)哪一个父类在前子类就优先继承哪一个父类
def __init__(self):
self.back_fatc = "自创的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学会了")
def make_fatc(self):
# 使用super()重名的方法去实现一次性调用父类中的同名属性
# 有参——>super(当前类名, self).函数()
super(Su, self).__init__()
super(Su, self).zi_0()
wangwu = Su()
wangwu.zi_0()
wangwu.make_fatc()
# 结果:
>>> 自创的拿手手艺我学会了
>>> 张三徒弟的拿手手艺我学会了
>>> 张三的拿手手艺我学走了
19.3.2、super() 无参
class Fath_1(object):
def __init__(self):
self.back_fatc = "张三的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学走了")
class Fath_2(Fath_1):
def __init__(self):
self.back_fatc = "张三徒弟的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学会了")
# 无参——>super()
super().__init__()
super().zi_0()
class Su(Fath_2): # 有几个父类加几个父类,(同名情况下)哪一个父类在前子类就优先继承哪一个父类
def __init__(self):
self.back_fatc = "自创的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学会了")
def make_fatc(self):
# 使用super()重名的方法去实现一次性调用父类中的同名属性
# 无参——>super()
super().__init__()
super().zi_0()
wangwu = Su()
wangwu.zi_0()
wangwu.make_fatc()
# 结果:
>>> 自创的拿手手艺我学会了
>>> 张三徒弟的拿手手艺我学会了
>>> 张三的拿手手艺我学走了
19.4、私有属性和私有方法
> 私有权限:在python中,可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类
> 方法:在属性名和方法名前面加上两个下划线__
获取和修改私有属性值:在python中,一般定义函数名etg_xx用来获取私有属性,定义set_xx用来修改私有属性值
class Fath_1(object):
def __init__(self):
self.back_fatc = "张三的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学走了")
class Fath_2(object):
def __init__(self):
# 共有权限
self.back_fatc = "张三徒弟的拿手手艺"
# 私有权限
self.__money = "200亿"
def zi_0(self):
print(f"{self.back_fatc}我学会了")
def info_printf(self):
print("这是私有方法")
class Duocen(Fath_2):
pass
tom = Duocen()
print(tom.back_fatc)
# print(tom.__money) # 报错
tom.info_printf()
# 结果:
>>> 张三徒弟的拿手手艺
>>> 这是私有方法
class Fath_1(object):
def __init__(self):
self.back_fatc = "张三的拿手手艺"
def zi_0(self):
print(f"{self.back_fatc}我学走了")
class Fath_2(object):
def __init__(self):
# 共有权限
self.back_fatc = "张三徒弟的拿手手艺"
# 私有权限
self.__money = "200亿"
# 获取私有属性值:一般定义函数名get__xx
def get_money(self):
return self.__money
# 修改私有属性值:一般定义函数名set__xx
def set_moner_1(self):
self.__money = "300亿"
def __info_print(self):
print("这是私有方法")
def Abc(self):
return self.__info_print()
class Duocen(Fath_2):
pass
tom = Duocen()
print(tom.get_money()) # 获取私有属性值
tom.set_moner_1() # 修改私有属性值
print(tom.get_money()) # 获取私有属性值
tom.Abc()
# 结果:
>>> 200亿
>>> 300亿
>>> 这是私有方法