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)
def make_fath_2(self):
Fath_2.__init__(self)
Fath_1.zi_0(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(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(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().__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().__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)
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亿"
def get_money(self):
return self.__money
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亿
>>> 这是私有方法
|