• 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员


    1、Python支持多层继承

    故事继续:N年后,徒弟老了,想要把所有技术传承给自己的徒弟。

    (1)多层继承实现

    python
    # 1.创建师父类,属性和方法
    class Master(object):
        def __init__(self):
            self.kongfu = '[古法煎饼果子配方]'
    
        def make_cake(self):
            print(f'运用{self.kongfu}制作煎饼果子')
    
    
    # 2.独创配方
    class Prentice(Master):
        def __init__(self):
            self.kongfu = '[独创煎饼果子配方]'
    
        def make_cake(self):
            self.__init__()
            print(f'运用{self.kongfu}制作煎饼果子')
    
        # 古法煎饼
        def make_master_cake(self):
            super().__init__()
            super().make_cake()
    
    
    # 3.徒孙类继承徒弟
    class Tusun(Prentice):
        pass
    
    
    # 步骤:
    # 创建Tusun对象,
    xiaotusun = Tusun()
    
    # 徒孙使用各种做法
    xiaotusun.make_cake()
    xiaotusun.make_master_cake()
    

    (2)多层继承和多重继承区别

    image

    图片参考:https://www.cnblogs.com/Through-Target/p/12118310.html

    2、继承中的私有成员

    私有成员包括私有成员变量和私有成员方法。

    (1)继承中父类私有属性和私有方法

    子类可以继承父类中所有的成员,包括私有成员,特殊成员。但是父类中的私有实例属性和私有实例方法,在子类没有执行权限的。

    故事继续:徒弟把技术传承给徒孙的同时,不想把自己的钱(8000000个亿)继承给徒孙,这个时候就要为这个实例属性设置私有权限。

    python
    # 1.独创配方
    class Prentice():
        def __init__(self):
            self.kongfu = '[独创煎饼果子配方]'
            # 定义私有属性,资产
            self.__money = 8000000
    
        # 摊煎饼
        def make_cake(self):
            self.__init__()
            print(f'运用{self.kongfu}制作煎饼果子')
    
        # 定义私有方法
        def __tellMe(self):
            print(self.kongfu)
            print(self.__money)
    
        def make_cake(self):
            self.__init__()
            print(f'运用{self.kongfu}制作煎饼果子')
    
    
    # 徒孙类
    class Tusun(Prentice):
        pass
    
    
    xiaoqiu = Tusun()
    
    # 子类对象调用父类的共有方法,可以
    xiaoqiu.make_cake()
    
    # 子类对象调用父类的公有属性,可以
    print(f"煎饼做法流派{xiaoqiu.kongfu}")
    
    # 子类对象调用父类的私有属性
    # 不可以报错:
    # AttributeError: 'Tusun' object has no attribute '__money'
    # print(f"煎饼做法流派{xiaoqiu.__money}")
    
    # 子类对象调用父类的私有方法
    # 不可以,报错
    # AttributeError: 'Tusun' object has no attribute '__tellMe'
    # xiaoqiu.__tellMe()
    
    """
    # 下面的方式子类可以直接访问父类的私有成员
    
    注意:
    子列对象不能直接访问父类的私有成员的原理
    和类中的私有属性私有方法的原理是一样的。
    不明白的可以去看前边的文章,私有成员变量。
    """
    print(f"煎饼做法流派{xiaoqiu._Prentice__money}")
    xiaoqiu._Prentice__tellMe()

    注意:子类可以继承父类中所有的成员,但是没有权限使用父类的私有属性和私有方法。

    (2)获取和修改私有属性值

    在Python中,一般定义函数名get_xx用来获取私有属性,定义set_xx用来修改私有属性值。

    python
    # 1.独创配方
    class Prentice():
        def __init__(self):
            self.kongfu = '[独创煎饼果子配方]'
            # 定义私有属性,资产
            self.__money = 8000000
    
        # 摊煎饼
        def make_cake(self):
            self.__init__()
            print(f'运用{self.kongfu}制作煎饼果子')
    
        # 定义私有方法
        def __tellMe(self):
            print(self.kongfu)
            print(self.__money)
    
        def make_cake(self):
            self.__init__()
            print(f'运用{self.kongfu}制作煎饼果子')
    
        # 获取私有属性
        def get_money(self):
            return self.__money
    
        # 修改私有属性
        def set_money(self, money):
            self.__money = money
    
    
    # 徒孙类
    class Tusun(Prentice):
        pass
    
    
    # 创建Tusun对象
    xiaoTusun = Tusun()
    
    # 获取子类对象继承父类的私有money
    print(xiaoTusun.get_money())  # 8000000
    
    # 设置子类对象中,父类的私有属性
    xiaoTusun.set_money(18888)
    
    # 在次查看
    print(xiaoTusun.get_money())  # 18888
    
    # 在创建一个新的Tusun对象
    xiaoTusun2 = Tusun()
    
    # 获取子类对象继承父类的私有money
    # 可以看到结果是# 8000000
    # 说明上边修改的私有属性是对象中的父类继承的私有属性
    # 和父类中的私有属性无关
    print(xiaoTusun2.get_money())  # 8000000

    总结:

    子类可以继承父类中所有的成员,但是没有权限使用父类的私有属性和私有方法。

    但是父类中定义了访问父类中私有变量的getter()setter()方法,子类也是可以继承到的。

    子类对象中可以通过继承到的getter()setter()方法,去修改和获取子类对象中所继承私有成员变量。


    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/15930915.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    systemverilog/uvm的 blog https://www.amiq.com/consulting/blog/
    django基于python的疫情数据可视化分析系统--python-计算机毕业设计
    开发跨端微信小程序框架选型指南
    PostgreSQL数据库统计信息——analyze统计信息收集
    Vue_指令
    【CSS3】CSS3 2D 转换 - rotate 旋转 ③ ( 使用 transfrom-origin 设置旋转中心点 | 使用 方位词 / 百分比值 / 像素值 设置旋转中心点 )
    国外网站国内镜像
    角点检测与SIFT
    HBase表数据的读、写操作与综合操作
    分享一个基于微信小程序的高校图书馆预约座位小程序 图书馆占座小程序源码 lw 调试
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/15930915.html