python进阶-----十九课(下)--继承

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亿
>>> 这是私有方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值