26_Python基础_继承

标签: Python基础  python  

面向对象三大特性:

  1. 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中
  2. 继承 实现代码的重用, 相同的代码不需要重复的编写
  3. 多态 不同的对象调用相同的方法,  产生不同的执行结果,  增加代码的灵活度

1.  单继承

1.1 概念

继承的概念:  子类 拥有 父类 的所有 方法 和 属性

1.2 语法

1)定义格式:

class 类名(父类名):
 
    pass

  • 子类 继承自 父亲,  可以直接 享受 父类中已经封装好的方法,  不需要再次开发
  • 子类 中应该根据 职责,  封装 子类特有的 属性和方法

class Animal:

    def eat(self):
        print("吃")

    def drink(self):
        print("喝")

    def run(self):
        print("跑")

    def sleep(self):
        print("睡")


class Dog(Animal):
# 子类拥有父类的所有属性和方法
    def bark(self):
        print("汪汪叫")

dahuang = Dog()
dahuang.sleep()
dahuang.bark()
 

2)比如该例中专业术语为:

  • Dog 类是 Animal 类的子类, Animal 类是 Dog 类的父类, Dog 类从 Animal 类继承
  • Dog 类是 Animal 类的派生类, Animal 类是 Dog 类的基类, Dog 类从 Animal 类派生

3)继承具有传递性:

  • C 类从 B 类继承,  B 类又从 A 类继承
  • 那么 C 类就具有 B 类和 A 类的所有属性和方法
class Animal:

    def eat(self):
        print("吃")

    def drink(self):
        print("喝")

    def run(self):
        print("跑")

    def sleep(self):
        print("睡")


class Dog(Animal):
# 子类拥有父类的所有属性和方法
    def bark(self):
        print("汪汪叫")

# 创建一个哮天犬类
class XiaoTianQuan(Dog):

    def fly(self):
        print("飞")

dahuang = XiaoTianQuan()
dahuang.bark()
dahuang.sleep()
dahuang.fly()

子类 拥有 父类 以及 父类的父类 中封装的所有 属性 和 方法 (儿子有父亲和爷爷的所有特点)

 

1.3 方法的重写

  • 子类 拥有 父类 的所有 方法 和 属性
  • 子类 继承自 父类,  可以直接 享受 父类中已经封装好的方法,  不需要再次开发

应用场景:

  • 当 父类 的方法实现不能满足子类需求时,  可以对方法进行 重新(voerwrite)。

重新 父类方法有两种情况:

  1. 覆盖 父类的方法
  2. 对父类方法进行 扩展

1)  覆盖父类的方法--子类中重写方法

  • 如果在开发中,  父类的方法实现 和 子类的方法实现, 完全不同,就可以使用 覆盖 的方式,  在子类中 重新编写 父类的方法实现

具体的实现方式,  就于在 子类中 定义了一个 和父类同名的方法并且实现。

重写之后,  在运行时,  只会调用 子类中重写的方法,  而不再回调用 父类封装的方法

2)  对父类方法进行 扩展

  • 如果在开发中,  子类的方法实现 中 包含 父类的方法实现父类 ,原本封装的方法实现 是 子类方法的一部分,就可以使用 扩展 的方式

实现方法:

  1. 在子类中 重写 父类的方法
  2. 在需要的位置使用 super( ), 父类方法 来调用父类方法的执行
  3. 代码其他的位置针对子类的需求, 编写 子类特有的代码实现

关于 super:

  • 在 Python 中 super 是一个 特殊的类
  • super() 就是使用 super 类创建出来的对象
  • 最常 使用的场景就是在 重写父类方法时,  调用 父类中封装的方法实现
class Dog():

    def bark(self):
        print("汪汪叫")

class XiaoTianQuan(Dog):

    def fly(self):
        print("I can fly")

    def bark(self):

        # 1. 针对子类特有的需求, 编写代码
        print("我是神犬....")

        # 2. 使用super(), 调用原本在父类中的封装的方法
        super().bark()

        # 3. 增加其他子类的代码
        print("嗷呜嗷呜...")

xiaotianquan = XiaoTianQuan()
xiaotianquan.bark()

1.4  父类的 私有属性 和 私有方法

  1. 子类对象 不能 在自己的方法内部, 直接 访问 父类的 私有属性 或 私有方法
  2. 子类对象 可以通过 父类 的 公有方法 间接 访问到 私有属性 或 私有方法
  • 私有属性, 方法 是对象的隐私,  不对外公开,  外界 以及 子类 都不能直接访问
  • 私有属性, 方法 通常用于做一些内部的事情

实例1:在子类的对象中,访问父类私有属性和方法

class A:
    def __init__(self):
        self.num1 = 100
        self.__num2 = 200

    def __test(self):
        print("私有方法 %d %d"(self.num1,self.__num2))


class B(A):

    def demo(self):
        # 1.在子类的对象中,不能访问父类私有属性
        #print("访问父类的私有属性 %d" % self.__num2)
        # 2. 在子类对象中,不可调用父类的私有方法
        self.__test()
        pass


# 创建一个子类对象
b = B()
print(b)
# 在外界不能直接访问对象的私有属性/调用私有方法
#print(b.__num2)
#b.__test()
b.demo()

输出:

Traceback (most recent call last):
<__main__.B object at 0x0000021935D6F588>
  File "C:/Users/10428/Desktop/Py-project/面向对象特性/ky_07_父类的私有属性和私有方法.py", line 26, in <module>
    b.demo()
  File "C:/Users/10428/Desktop/Py-project/面向对象特性/ky_07_父类的私有属性和私有方法.py", line 16, in demo
    self.__test()
AttributeError: 'B' object has no attribute '_B__test'

Process finished with exit code 1

结论:子类对象 不能 在自己的方法内部, 直接 访问 父类的 私有属性 或 私有方法

实例二:在子类的对象中,通过父类方法,间接访问父类私有属性和方法

class A:
    def __init__(self):
        self.num1 = 100
        self.__num2 = 200

    def __test(self):
        print("私有方法 %d %d"%(self.num1,self.__num2))

    def test(self):
        print("父类的公有方法")
        self.__test()

class B(A):

    def demo(self):
        # 1.在子类的对象中,不能访问父类私有属性
        #print("访问父类的私有属性 %d" % self.__num2)
        # 2. 在子类对象中,不可调用父类的私有方法
        #self.__test()
        # 3.访问父类的公有属性
        print("子类方法 %d" % self.num1)
        # 4.调用父类的公有方法
        self.test()

        pass


# 创建一个子类对象
b = B()
b.demo()

 

 

版权声明:本文为qq_41719643原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41719643/article/details/107673942

智能推荐

Java编程思想 第三章:操作符

Java中的操作符和c/c++中的操作符基本一致,因为我之前学习过C语言和C++,所以本章的内容大部分都已熟知,下面只做简单的介绍。 Java操作符及优先级 Java中的操作符包括算术操作符,关系操作符,逻辑操作符,位运算符、自操作运算符、移位运算符、赋值运算符和其他运算符。 算术操作符:包括加减乘除和取余(%),优先级乘除取余高于加减,都是双元运算符,其中加法(+)可以用来连接两个字符串,比如:...

JetBrains 系列开发工具,如何配置 `SCSS` `File Watcher` ,相关输出配置参数详解:webStorm phpStorm IDEA

JetBrains 系列开发工具,如何配置 SCSS File Watcher ,相关输出配置参数详解:webStorm phpStorm IDEA 前言 你目前已经了解了如何使用 SCSS 进行开发,了解了该文章的内容:『 SCSS 日常用法 』 在 JetBrains 系列开发工具中通过 FileWatcher 进行编译的 SCSS 文件都是通过 sass 这个程序进行的。『 如何添加 Fil...

C语言小函数—二进制与十六进制

测试如下 “` int main() { long int num = 15; } “`...

仿微博或微信的文章多图显示(自定义MultiImageView)

按照一般的规矩,先上张图来供大伙看看 如果大致是大伙们需要实现的功能,不烦一观 自定义MultiImageView 工具类 具体使用 app.gradle中添加依赖 implementation 'com.github.bumptech.glide:glide:4.8.0' AndroidManifest.xml中配置联网权限 <uses-permission android:name=&q...

经典进程同步和互斥问题

经典进程同步与互斥问题 前言 一、生产者-消费者问题 1.问题描述 2.问题分析 3.代码 二、读者-写者问题 1.问题描述&&分析 2.代码 三、哲学家进餐问题 1.问题描述&&分析 2.代码 四、理发师问题 1.问题描述&&分析 2.代码 前言 在多道程序设计环境中,进程同步是一个非常重要的问题,下面讨论几个经典的进程同步问题。 一、生产者-消费...

猜你喜欢

java设计模式——ThreadLocal线程单例

1、定义一个ThreadLocal线程单例,代码如下: 2、定义一个多线程类,代码如下: 3、定义一个测试类,代码如下: 4、输出结果,如下图:...

【tensorflow】线性模型实战

线性模型:y = 1.477 * x + 0.089   1. 采样数据 采样噪声eps在均值0,方差0.01的高斯分布中,而后在均匀分布U(0,1)中,区间[-10,10]进行n=100次随机采样:   2. 计算误差 循环计算每个点的预测值与真是值之间差的平方并累加,从而获得训练集上的均芳误差损失值。   3. 计算梯度   4. 梯度更新 对权重w和偏...

常见损失函数和评价指标总结(附公式&代码)

网上看到一篇很实用的帖子关于常见损失函数和评价指标,收藏下来 本文转载于https://zhuanlan.zhihu.com/p/91511706 ------------------------------------------------------------------------------------------------------------------------------...

为什么 4G/5G 的直播延时依然很高

通信技术的发展促进了视频点播和直播业务的兴起,4G 和 5G 网络技术的进步也使得流媒体技术变得越来越重要,但是网络技术并不能解决流媒体直播的高延迟问题。 本文不会介绍网络对直播业务的影响,而是会分析直播中常见的现象 — 主播和观众之间能够感觉到的明显网络延迟。除了业务上要求的延迟直播之外,有哪些因素会导致视频直播的延迟这么高呢? live-streaming  图 1 - ...

springboot 过滤器Filter vs 拦截器Interceptor 详解

1 前言       最近接触到了过滤器和拦截器,网上查了查资料,这里记录一下,这篇文章就来仔细剖析下过滤器和拦截器的区别与联系。 2 拦截器与过滤器之间的区别 从上面对拦截器与过滤器的描述来看,它俩是非常相似的,都能对客户端发来的请求进行处理,它们的区别如下: 作用域不同 过滤器依赖于servlet容器,只能在 servlet容器,web环境下使用 拦截器依赖于sp...