第十五天Python之多态

2024-02-21 01:38
文章标签 python 多态 第十五天

本文主要是介绍第十五天Python之多态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

多态

目标

  • 多态

面向对象三大特性

  1. 封装 根据 职责属性方法 封装 到一个抽象的
    - 定义类的准则
  2. 继承 实现代码的重用, 相同的代码不需要重复的编写
    - 设计类的技巧
    - 子类针对自己特有的需求,编写特定的代码
  3. 多态 不同的 子类对象 调用相同的 父类方法, 产生不同的执行结果
    - 多态 可以 增加代码的灵活度
    - 以 继承重写父类方法 为前提
    - 是调用方法的技巧,不会影响到类的内部设计

在这里插入图片描述

多态案例演练

需求

  1. 在 Dog 类中封装方法 game
    - 普通狗只是简单的玩耍
  2. 定义 XiaoTianDog 继承自 Dog ,并且重写 game 方法
    - 哮天犬需要在天上玩耍
  3. 定义 Person 类,并且封装一个 和狗玩 的方法
    - 在方法内部,直接让 狗对象 调用 game 方法

在这里插入图片描述

案例小结

  • Person 类中只需要让 狗对象 调用 game 方法,而不关心具体是 什么狗
    - game 方法是在 Dog 父类中定义的
  • 在程序执行时,传入不同的 狗对象 实参,就会产生不同的执行效果

一、类的结构

1. 术语 —— 实例

  • 使用面向对象开发,第 1 步 是设计
  • 使用 类名() 创建对象, 创建对象 的动作有两步:
    - 1)在内存中为对象 分配空间
    - 2)调用初始化方法 __ init __ 为 对象初始化
  • 对象创建后,内存 中就有了一个对象的 实实在在 的存在 —— 实例

在这里插入图片描述

因此,通常也会把:

  1. 创建出来的 对象 叫做 实例
  2. 创建对象的 动作 叫做 实例化
  3. 对象的属性 叫做 实例属性
  4. 对象调用的方法 叫做 实例方法

在程序执行时:

  1. 对象各自拥有自己的 实例属性
  2. 调用对象方法,可以通过 self.
    - 访问自己的属性
    - 调用自己的方法

结论

  • 每个对象 都有自己 独立的内存空间,保存各自不同的属性
  • 多个对象的方法,在内存中只有一份, 在调用方法时,需要把对象的引用 传递到方法内部

2. 类是一个特殊的对象
Python 中 一切皆对象
- class AAA: 定义的类属于 类对象
- obj1 = AAA() 属于 实例对象

  • 在程序运行时, 同样 会被加载到内存
  • 在 Python 中, 是一个特殊的对象 —— 类对象
  • 在程序运行时,类对象 在内存中 只有一份 ,使用 一个类 可以创建出 很多个对象实例
  • 除了封装 实例属性方法外,类对象 还可以拥有自己的 属性方法
  1. 类属性
  2. 类方法
  • 通过 类名. 的方式可以 访问类的属性 或者 调用类的方法

在这里插入图片描述

二、类属性和实例属性

1. 概念和使用

  • 类属性 就是给 类对象 中定义的 属性
  • 通常用来记录 与这个类相关 的特征
  • 类属性 不会用于 记录 具体对象的特征

示例需求

  • 定义一个 工具类
  • 每件工具都有自己的 name
  • 需求 —— 知道使用这个类,创建了多少个工具对象?
    在这里插入图片描述
class Tool(object):# 使用赋值语句定义类属性,记录所有工具对象的数量count = 0def __init__(self,name):self.name = name# 让类属性的值 +1Tool.count += 1# 1. 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("水桶")# 2. 输出工具对象的总数
print(Tool.count)

2. 属性的获取机制(科普)

  • 在 Python 中 属性的获取 存在一个 向上查找机制
    在这里插入图片描述
  • 因此,要访问类属性有两种方式:
  1. 类名.类属性
  2. 对象.类属性(不推荐)

注意

  • 如果使用 对象.类属性 = 值 赋值语句,只会 给对象添加一个属性, 而不会影响到 类属性的值

三、类方法和静态方法

1. 类方法

  • 类属性 就是针对 类对象 定义的属性
    - 使用 赋值语句 在 class 关键字下方可以定义 类属性
    - 类属性 用于记录 与这个类相关 的特征
  • 类方法 就是针对 类对象 定义的方法
    - 在 类方法 内部可以直接访问 类属性 或者调用其他的 类方法

语法如下

@classmethod
def 类方法名(cls):pass
  • 类方法需要用 修饰器 @classmethod 来标识, 告诉解释器这是一个类方法
  • 类方法的 第一个参数 应该是 cls
    - 由 哪一个类 调用的方法,方法内的 cls 就是 哪一个类的引用
    - 这个参数和 实例方法 的第一个参数是 self 类似
    - 提示 使用其他名称也可以,不过习惯使用 cls
  • 通过 类名. 调用 类方法,调用方法时, 不需要 传递 cls 参数
  • 在方法内部
    - 可以通过 cls. 访问类的属性
    - 也可以通过 cls. 调用其他的类方法

示例需求

  • 定义一个 工具类
  • 每件工具都有自己的 name
  • 需求—— 封装一个 show_tool_count 的类方法,输出使用当前这个类,创建的对象个数

在这里插入图片描述

    @classmethoddef show_tool_count(cls):print("工具对象的数量 %d" % cls.count)

在类方法内部,可以直接使用 cls 访问 类属性 或者 调用方法

2. 静态方法

  • 在开发时,如果需要在 中封装一个方法,这个方法:
    - 既 不需要 访问 实例属性 或者调用 实例方法
    - 也 不需要 访问 类属性 或者调用 类方法
  • 这个时候,可以把这个方法封装成一个 静态方法

语法如下

@staticmethod
def 静态方法名():pass
  • 静态方法 需要用 修饰器 @staticmethod 来标识, 告诉解释器这是一个静态方法
  • 通过 类名. 调用 静态方法
class Dog (object):@staticmethoddef run():# 不访问实例属性/类属性print("小狗要跑...")# 通过类名.调用静态方法 - 不需要创建对象
Dog.run()

3. 方法综合案例
需求

  1. 设计一个 Game 类
  2. 属性:
    - 定义一个 类属性 top_score 记录游戏的 历史最高分
    - 定义一个 实例属性 player_name 记录 当前游戏的玩家姓名
  3. 方法:
    - 静态方法 show_help 显示游戏帮助信息
    - 类方法 show_top_score 显示历史最高分
    - 实例方法 start_game 开始当前玩家的游戏
  4. 主程序步骤
    - 1)查看帮助信息
    - 2)查看历史最高分
    - 3)创建游戏对象,开始游戏
    在这里插入图片描述

案例小结

  1. 实例方法 —— 方法内部需要访问 实例属性
    - 实例方法 内部可以使用 类名. 访问类属性
  2. 类访问 —— 方法内部 需要访问 类属性
  3. 静态方法 —— 方法内部,不需要访问 实例属性类属性

提问
如果方法内部 既需要访问 实例属性,又需要访问 类属性 ,应该定义成什么方法?

答案

  • 应该定义 实例方法
  • 因为,类只有一个,在 实例方法 内部可以使用 类名. 访问类属性

这篇关于第十五天Python之多态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730198

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数