Python学习打卡:day14

day14

笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了

目录

  • day14
    • 102、封装
      • 三大特性
      • 对用户隐藏的属性和行为
      • 私有成员
      • 使用私有成员
    • 103、封装的课后习题
    • 104、继承
      • 单继承
      • 多继承
    • 105、复写父类成员和调用父类成员
      • 复写
      • 调用父类同名成员
    • 106、变量的类型注解
      • 类型注释的目的
      • 类型注解
      • 类型注解的语法
        • 变量设置类型注解
        • 注释中进行类型注解
    • 107、函数和方法类型注释
      • 函数(方法)的类型注解——形参注解
      • 函数(方法)的类型注解——返回值注解
    • 108、Union联合类型注释
      • Union类型
    • 109、多态
      • 抽象类(接口)

102、封装

三大特性

面向对象包含3大主要特性:

  • 封装
  • 继承
  • 多态

封装表示的是,将现实世界事物的:

  • 属性
  • 行为

封装到类中,描述为:

  • 成员变量
  • 成员方法

从而完成程序对现实世界事物的描述
在这里插入图片描述

对用户隐藏的属性和行为

现实世界中的事物,有属性和行为。

但是不代表这些属性和行为都是开放给用户使用的。

私有成员

既然现实事物有不公开的属性和行为,那么作为现实事物在程序中映射的类,也应该支持。

类中提供了私有成员的形式来支持。

  • 私有成员变量
  • 私有成员方法

定义私有成员的方式非常简单,只需要:

  • 私有成员变量:变量名以 __开头(2个下划线)
  • 私有成员方法:方法名以 __开头(2个下划线)

即可完成私有成员的设置。

示例图如下:

在这里插入图片描述

使用私有成员

  • 私有方法无法直接被类对象使用
    在这里插入图片描述
    在这里插入图片描述

  • 私有变量无法赋值,也无法获取值

    在这里插入图片描述

  • 私有成员无法被类对象使用,但是可以被其它的成员使用
    在这里插入图片描述

示例代码:

"""
演示面向对象封装思想中私有成员的使用
"""

# 定义一个类,内含私有成员变量和私有成员方法
class Phone:
    # __current_voltage = None    # 当前手机运行电压
    # __current_voltage = 1
    __current_voltage = 0.5

    def __keep_single_core(self):
        print("让 CPU 以单核模式运行")

    def call_by_5g(self):
        if self.__current_voltage >= 1:
            print("5g通话已开启")
        else:
            self.__keep_single_core()
            print("电量不足,无法使用5g通话,并已设置为单核进行省电。")

phone = Phone()
phone.call_by_5g()

# error: 不能直接使用私有成员
# phone.__keep_single_core()
# print(phone.__current_voltage)

103、封装的课后习题

在这里插入图片描述

示例代码:

class Phone:
    # __is_5g_enable = None
    __is_5g_enable = True
    # __is_5g_enable = False

    def __check_5g(self):
        if self.__is_5g_enable == True:
            print("5g开启")
        else:
            print("5g关闭,使用4g网络")

    def call_by_5g(self):
        self.__check_5g()
        print("正在通话中")

phone = Phone()
phone.call_by_5g()

104、继承

在这里插入图片描述

  • 继承分为:单继承和多继承
  • 使用如图语法,可以完成类的单继承。
  • 继承表示:将从父类那里继承(复制)来成员变量和成员方法(不含私有)

单继承

继承前:

在这里插入图片描述

继承后:

在这里插入图片描述

示例代码:

# 演示单继承
class Phone:
    IMEI = None         # 序列号
    producer = "ITCAST"     # 厂商

    def call_by_4g(self):
        print("4g通话")

class Phone2022(Phone):
    face_id = "10001"   # 面部识别ID

    def call_by_5g(self):
        print("2022年新功能:5g通话")

phone = Phone2022()
print(phone.producer)
phone.call_by_4g()
phone.call_by_5g()

# 结果
ITCAST
4g通话
2022年新功能:5g通话

多继承

Python 的类之间也支持多继承,即一个类,可以继承多个父类。

在这里插入图片描述

"""
演示面向对象:继承的基础语法
"""
# 演示多继承
class Phone:
    IMEI = None         # 序列号
    producer = "ITCAST"     # 厂商

    def call_by_4g(self):
        print("4g通话")

        
class NFCReader:
    nfc_type = "第五代"
    producer = "HM"

    def read_card(self):
        print("NFC读卡")

    def write_card(self):
        print("NFC写卡")


class RemoteControl:
    rc_type = "红外遥控"

    def control(self):
        print("红外遥控开启了")

        
class MyPhone(Phone, NFCReader, RemoteControl):
    pass    # 功能足够了,但是为了语法不出错,因此使用 pass


my_phone = MyPhone()
my_phone.call_by_4g()
my_phone.read_card()
my_phone.write_card()
my_phone.control()

print(my_phone.producer)

# 结果
4g通话
NFC读卡
NFC写卡
红外遥控开启了
ITCAST	# 派生类对基类的成员变量重新赋值,会覆盖掉基类中成员变量的值

tips:pass是占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思

105、复写父类成员和调用父类成员

复写

子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写。

即:在子类中重新定义同名的属性或方法即可。

"""
演示面向对象:继承的基础语法
"""

# 演示单继承
class Phone:
    IMEI = None         # 序列号
    producer = "ITCAST"     # 厂商

    def call_by_5g(self):
        print("使用5g网络进行通话")

# 定义子类,复写父类成员
class MyPhone(Phone):
    producer = "ITHEIMA"    # 复写父类的成员属性

    def call_by_5g(self):
        print("开启CPU单核模式,确保通话的时候省电")
        print("使用5g网络进行通话")
        print("关闭CPU单核模式,确保性能")

phone = MyPhone()
phone.call_by_5g()
print(phone.producer)

调用父类同名成员

一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员

如果需要使用被复写的父类的成员,需要特殊的调用方式:

方式1:

  • 调用父类成员

使用成员变量:父类名.成员变量

使用成员方法:父类名.成员方法(self)

方式2:

  • 使用super()调用父类成员

使用成员变量:super().成员变量

使用成员方法:super().成员方法()

示例代码:

"""
演示面向对象:继承的基础语法
"""

class Phone:
    IMEI = None         # 序列号
    producer = "ITCAST"     # 厂商

    def call_by_5g(self):
        print("使用5g网络进行通话")

# 定义子类,复写父类成员
class MyPhone(Phone):
    producer = "ITHEIMA"    # 复写父类的成员属性

    def call_by_5g(self):
        print("开启CPU单核模式,确保通话的时候省电")
        # # 方式 1
        # print(f"父类的厂商是:{Phone.producer}")
        # Phone.call_by_5g(self)
        
        # 方式 2
        print(f"父类的厂商是:{super().producer}")
        super().call_by_5g()
        print("关闭CPU单核模式,确保性能")

phone = MyPhone()
phone.call_by_5g()
print(phone.producer)

tips:

  • 只能在子类内调用父类的同名成员。
  • 子类的类对象直接调用会调用子类复写的成员

106、变量的类型注解

类型注释的目的

提示变量类型;

提示调用方法需传入的参数类型。

类型注解

Python在3.5版本的时候引入了类型注解,以方便静态类型检查工具,IDE等第三方工具。

类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。

主要功能:

  • 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
  • 帮助开发者自身对变量进行类型注释

支持:

  • 变量的类型注解
  • 函数(方法)形参列表和返回值的类型注解

类型注解的语法

变量设置类型注解

基础语法: 变量: 类型

  • 基础数据类型注解

    # 基础数据类型注释
    var1: int = 10
    var2: str = "itheima"
    var3: bool = True
    
  • 类对象类型注解

    # 类对象类型注释
    class Student:
        pass
    stu : Student = Student()
    
  • 基础容器类型注解

    # 基础容器类型注释
    my_list : list = [1, 2, 3]
    my_tuple : tuple = (1, 2, 3)
    my_dict : dict = {"itheima" : 666}
    
  • 容器类型详细注释

    # 容器类型详细注释
    my_list : list[int] = [1, 2, 3]
    my_tuple : tuple[int, str, bool] = (1, "itheima", True)
    my_dict : dict[str, int] = {"itheima" : 666}
    

    tips:

    • 元组类型设置类型详细注解,需要将每一个元素都标记出来
    • 字典类型设置类型详细注解,需要 2 个类型,第一个是 key 第二个是value
注释中进行类型注解

除了使用 变量: 类型, 这种语法做注解外,也可以在注释中进行类型注解。

语法:

# type: 类型

示例:

# 在注释中进行类型注解
var_1 = random.randint(1, 10)   # type: int
var_2 = json.loads('{"name" : "zhangsan }')     # type: dict[str, str]
def func():
    return 10
var_3 = func() # type: int

tips:PyCharm 中输入 random 后使用快捷键 alt+Enter,可以快速导入random模块

107、函数和方法类型注释

函数(方法)的类型注解——形参注解

在这里插入图片描述

在这里插入图片描述

如图所示:

  • 在编写函数(方法),使用形参data的时候,工具没有任何提示
  • 在调用函数(方法),传入参数的时候,工具无法提示参数类型

这些都是因为,我们在定义函数(方法)的时候,没有给形参进行注解。

函数和方法的形参类型注解语法:

在这里插入图片描述

示例:

在这里插入图片描述

函数(方法)的类型注解——返回值注解

函数(方法)的返回值也是可以添加类型注解的。

语法如下:

在这里插入图片描述

示例:

在这里插入图片描述

在这里插入图片描述

"""
演示函数和方法的类型注释
"""

# 对参数进行类型注释
def add(x: int, y : int):
    return x + y


# 对返回值进行类型注释
def func(data: list) -> list:
    return data

print(func(1))

108、Union联合类型注释

在遇到如下字典类型时,无法用单一类型进行注释:
在这里插入图片描述

因此需要引入 Union[类型, ......, 类型] 进行联合类型注释。

Union类型

Union联合类型注解,在变量注解、函数(方法)形参和返回值注解中,均可使用。

tips:导包:from typing import Union

示例:

"""
演示 Union联合类型注释
"""

# 使用 Union类型,必须先导包
from typing import Union

my_list : list[Union[int, str]] = [1, 2, "itheima", "itcast"]

def func(data: Union[int, str]) -> Union[int, str]:
    pass

func()

109、多态

多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。

在这里插入图片描述

在这里插入图片描述

同样的行为(函数),传入不同的对象,得到不同的状态

多态常作用在继承关系上

比如

  • 函数(方法)形参声明接收父类对象
  • 实际传入父类的子类对象进行工作

即:

  • 以父类做定义声明
  • 以子类做实际工作
  • 用以获得同一行为, 不同状态

示例代码:

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        print("汪汪汪")


class Cat(Animal):
    def speak(self):
        print("喵喵喵")

def make_noise(animal: Animal):
    """制造点噪音,需要传入Animal对象"""
    animal.speak()


# 演示多态,使用 2 个子类来调用函数
dog = Dog()
cat = Cat()

make_noise(dog)
make_noise(cat)

# 结果
汪汪汪
喵喵喵

抽象类(接口)

在这里插入图片描述

父类Animal的speak方法,是空实现。

这种设计的含义是:

  • 父类用来确定有哪些方法
  • 具体的方法实现,由子类自行决定

这种写法,就叫做抽象类(也可以称之为接口)

抽象类:含有抽象方法的类称之为抽象类

抽象方法:方法体是空实现的(pass)称之为抽象方法

示例代码:

# 演示多态,使用 2 个子类来调用函数
dog = Dog()
cat = Cat()

make_noise(dog)
make_noise(cat)


# 演示抽象类
class AC:
    def cool_wind(self):
        """制冷"""
        pass
    
    def hot_wind(self):
        """制热"""
        pass
    
    def swing_l_r(self):
        """左右摆风"""
        pass
    
class Midea_AC(AC):
    def cool_wind(self):
        print("美的空调制冷")

    def hot_wind(self):
        print("美的空调制热")

    def swing_l_r(self):
        print("美的空调左右摆风")
        

class GREEN_AC(AC):
    def cool_wind(self):
        print("格力空调制冷")

    def hot_wind(self):
        print("格力空调制热")

    def swing_l_r(self):
        print("格力空调左右摆风")

def make_cool(ac:AC):
    ac.cool_wind()
    
midea_ac = Midea_AC()
green_ac = GREEN_AC

make_cool(midea_ac)
make_cool(green_ac)

# 结果
美的空调制冷
格力空调制冷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/736561.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经网络学习3-卷积层

膨胀卷积,也被称为空洞卷积或扩张卷积,是一种特殊的卷积运算,它在标准卷积的基础上引入了一个额外的超参数,即膨胀率(dilation rate)。这个超参数决定了在卷积核的元素之间插入多少额外的空间。通过这种方式…

图解注意力

图解注意力 Part #2: The Illustrated Self-Attention 在文章前面的部分,我们展示了这张图片来展示自注意力被应用于正在处理单词"it"的一层中: 在本节中,我们将看看这是如何完成的。请注意,我们将以一种试图理解单…

Linux系统编程--软/硬连接

真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode。 命令: 软连接:ln -s 原文件名 新文件名 硬链接:ln 原文件名 新文件名 删除链接文件:unlink 文件名执行上面两条命令…

linux 简单使用 sftp 和 lftp命令

目录 一. 环境准备二. sftp命令连接到SFTP服务器三. lftp命令3.1 连接FTP和SFTP服务器3.2 将文件从sftp服务器下载到本地指定目录 四. 通过WinSCP命令行从SFTP服务器获取文件到Windows 一. 环境准备 ⏹在安卓手机上下载个MiXplorer,用作SFTP和FTP服务器 官网: htt…

MySQL数据库(一):数据库介绍与安装

在嵌入式开发中,数据库的重要性体现在高效的数据存储和管理、数据持久化、复杂查询和处理、数据同步和共享、安全性和可扩展性。常见嵌入式数据库包括SQLite、MySQL、LevelDB等,应用于智能家居、工业控制、车载系统和物联网设备,提升了系统功…

网络编程篇:HTTP协议

一.预备知识 在客户端访问服务端时,要用ipport,但是在日常用户访问服务端的时候,并不会直接使用ip,而是使用域名,比如:百度(www.baidu,com)。 …

深度学习11-13

1.神经元的个数对结果的影响: (http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html) (1)神经元3个的时候 (2)神经元是10个的时候 神经元个数越多,可能会产生…

在C++中,构造器(Builder)模式的思考(《C++20设计模式》及常规设计模式对比)

文章目录 一、前言二、为什么需要Builder Pattern,Builder Pattern到底解决了什么实际问题?为什么不用set()方法?2.1 初学者有那些对象的属性初始化方法呢?2.1.1 构造函数的弊端2.1.1.1 对于属性的初始化只能是固定的顺序 2.1.2 用set()函数初…

在线随机密码生成工具

对于运维工作,经常需要生产随机密码,这里介绍一款在线生成密码工具,支持配置密码组合类型,如数字、字母大小写、特殊字符等,还能排除某些特殊字符。 在线随机密码生成工具 https://tool.hiofd.com/random-string-gen…

SCI一区级 | Matlab实现BO-Transformer-LSTM多变量时间序列预测

SCI一区级 | Matlab实现BO-Transformer-LSTM多变量时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-LSTM多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现BO-Transformer-LSTM多变量时间序列预测,贝叶斯…

嵌入式中逻辑分析仪与示波器的基本原理

大家好,今天主要给大家分享一下,嵌入式中如何使用逻辑分析仪和示波器的方法,希望对大家有所帮助。 https://dreamsourcelab.cn/ 第一:什么是逻辑分析仪 是否遇到使用示波器分析数字电路的冏境:深度不够,时间太短,无法抓到想要的波形,没有协议内容解析? 逻辑分析仪…

项目八 OpenStack存储管理

任务一 理解OpenStack块存储服务 1.1 •Cinder的主要功能 • 提供 持久性块存储资源,供 Nova 计算服务的虚拟机实例使用 。 • 为 管理块存储设备提供一套方法,对卷实现从创建到删除的整个生命周期 管理。 • 将 不同的后端存储进行封装,对外…

利用竞争智慧与大型语言模型:假新闻检测的新突破

Explainable Fake News Detection With Large Language Model via Defense Among Competing Wisdom 论文地址: Explainable Fake News Detection with Large Language Model via Defense Among Competing Wisdom | Proceedings of the ACM on Web Conference 2024https://dl.…

uni-CMS:全端开源内容管理系统的技术探索

摘要 本文介绍了uni-CMS,一个基于uniCloud开发的开源内容管理系统(CMS)。该系统旨在帮助开发者快速搭建并管理内容丰富的网站、小程序和移动应用。通过其全端渲染、内容安全检测、广告解锁付费内容以及AI生成文章等特性,uni-CMS不…

【算法】优先级队列-基础与应用

优先级队列(Priority Queue)是一种特殊的队列类型,它允许在其元素中分配优先级。与传统的先进先出(FIFO)队列不同,优先级队列中元素的出队顺序取决于它们的优先级。优先级较高的元素会被优先处理&#xff0…

数组移除元素算法(以JS为例)

题目:LeeCode第27题 答案: 算法思想:双指针 这段代码实际上使用了一种简化版的双指针技术来实现元素的移除。这里的双指针技术并不是传统意义上的两个指针,而是一个索引k作为辅助指针,用来记录新数组(或原…

面试:关于word2vec的相关知识点Hierarchical Softmax和NegativeSampling

1、为什么需要Hierarchical Softmax和Negative Sampling 从输入层到隐含层需要一个维度为NK的权重矩阵,从隐含层到输出层又需要一个维度为KN的权重矩阵,学习权重可以用反向传播算法实现,每次迭代时将权重沿梯度更优的方向进行一小步更新。但…

机器学习基础:与Python关系和未来发展

目录 初识Python Python的由来 自由软件运动 编译方式的演进 Python语言的特点 语法简单,易于理解 语法结构清晰,快速上手 丰富的第三方库 机器学习 监督学习 无监督学习 半监督学习 欢迎回到我们的神经网络与深度学习Tensorflow实战学习&am…

Python 虚拟环境 requirements.txt 文件生成 ;pipenv导出pip安装文件

搜索关键词: Python 虚拟环境Pipenv requirements.txt 文件生成;Pipenv 导出 pip requirements.txt安装文件 本文基于python版本 >3.9 文章内容有效日期2023年01月开始(因为此方法从这个时间开始是完全ok的) 上述为pipenv的演示版本 使用以下命令可精准生成requirement…

thrift接口调用工具

写了一个thrift接口调用工具 导入thrift文件就可以直接调用相应接口 工具会根据thrift文件中接口的参数名,参数类型,返回值等等,自动生成接口参数,和结果json化显示。 https://github.com/HuaGouFdog/Fdog-Kit