Python__面向对象__多态学习

news2024/9/26 5:21:34

目录

一、多态

1.多态定义理解

2.实例属性和类属性

3.类相关的函数

(1) 实例方法

(2)类方法

(3)静态方法 

 

一、多态

1.多态定义理解

在Python中,多态是一种特性,类似于一个接口,允许在一个对象中的一个操作可作用在不同类型的对象上,执行的不同的任务。

示例:

# 定义一个文具的类
class Stationery(object):
    # 定义一个study的方法(函数)
    def study(self):
        print("一些学习用品")

# 定义一个Rule类,继承自 Stationery 类
class Rule(Stationery):
    def study(self):  # 重写父类的study方法
        print("学习三角板的用法")

# 定义一个Compass类,继承自 Stationery 类
class Compass(Stationery):
    def study(self):  
        print("学习圆规的用法")

# 定义一个 draw 函数,然后接受Stationery类的一个实例
def draw(line):
    line.study()

rule = Rule()  # 创建 Rule 类的一个实例
draw(rule)  # 调用 draw 函数并传入 rule,并调用 Rule 类的 study 方法
compass = Compass()
draw(compass)

以上段代码中,draw 函数接受一个参数 line,这个参数可以是 Stationery类或其任何子类的实例。draw函数中的 line.study() 调用将根据传入对象的实际类型来执行相应的study方法。这就是多态的表现。

2.实例属性和类属性

可参考这篇中“类的定义”理解 

https://blog.csdn.net/le_u_6/article/details/139290390?spm=1001.2014.3001.5502icon-default.png?t=N7T8https://blog.csdn.net/le_u_6/article/details/139290390?spm=1001.2014.3001.5502

3.类相关的函数

在Python中,根据使用需求的所不同,可将类相关的方法(函数)分为:实例方法、类方法和静态方法。

(1) 实例方法

实例方法是与类实例(对象)相关联的方法。它们通常用于操作或访问类的实例属性。实例方法使用def关键定义,并且其第一个参数通常是self,代表当前的实例对象。
示例:

class Clothes: 
   # 定义初始化的四个实例属性 :size, brand, cost,price
    def __init__(self, size, brand, price):  

        self.size = size  # 实例属性赋值
        self.brand = brand  # 实例属性赋值
        self.cost = 50  # 成本价初始化为50
        self.price = price 
   
   # 以下定义三个实例方法:on_season,off_season,current_price

    def on_season(self, rise):  
        self.price = self.cost + rise  # 计算旺季时的价格

    def off_season(self, fall):  
        self.price = self.cost + fall  # 计算淡季时的价格

    def current_price(self):   
        print("当前价格:", self.price, "CNY")  # 计算当前总价格
        return self.price   

# 创建Clothes类的一个c1实例
c1 = Clothes("XL码", "NIKE", None)

# 给c1实例动态添加rise属性,并赋值为200
c1.rise = 200

# 调用on_season方法,并传入c1.rise作为涨价额度
c1.on_season(c1.rise)   

# 调用current_price方法,输出当前价格
c1.current_price()   

# 创建Clothes类的一个c2实例
c2 = Clothes("XL码", "ANTA",None)

c2.fall = 5

# 调用off_season方法,并传入c2.fall作为降价额度
c2.off_season(c2.fall)

c2.current_price()   # 快买!

在三个实例方法内部中,使用self关键字引用当前实例对象的属性,通过对属性的操作实现对价格的调整。

(2)类方法

类方法是与类本身相关联的方法,而不是类的实例。它们通常用于操作类属性或需要与类相关的功能。类方法使用@classmethod装饰器定义,并且其第一个参数通常是 cls,代表类本身。

例:

class Clothes:
    # 定义一个类属性,用于记录衣物的总件数
    total_clothes = 0

    # 定义两个实例属性,用于记录衣物的尺寸和品牌
    def __init__(self, size, brand):
       
        self.size = size
        self.brand = brand
        # 每次创建衣物实例时,总数增加1
        Clothes.total_clothes += 1

    # 类方法,用于获取衣物的总数
    @classmethod
    def get_total_clothes(cls):
        # 返回衣物的总数
        return cls.total_clothes

# 创建两个衣物实例
c1 = Clothes("XXL码", "NIKE")
c2 = Clothes("XL码", "ANTA")

# 当前的衣物总数
print(Clothes.get_total_clothes(), "件")

(3)静态方法

静态方法是与类相关联的方法,但它们不接收类或实例的引用作为参数。它们通常用于工具函数或与类和实例无关的逻辑。静态方法使用@staticmethod装饰器定义,它们可以看作是类内部的普通函数。

例:

class Clothes:

    # 定义4个初始化的实例属性
    def __init__(self, size, brand, item, number):
         
        self.size = size
        self.brand = brand
        self.item = item  # 单价
        self.number = number  # 数量

    @staticmethod  # 静态方法
    def get_total_price(item, number):
        # 计算总价
        return item * number

# 创建一个衣物实例
c = Clothes("XL码", "ANTA", 45, 100)

# 调用静态方法 get_total_price ,并传入单价和数量
total_price = Clothes.get_total_price(c.item, c.number)

# 最后计算出的总金额
print("总额:", total_price, "CNY")

综上所述,装饰器是区分这三种方法的一个显著标志:

实例方法没有特殊的装饰器,通常以 self 作为第一个参数。

类方法使用 @classmethod 装饰器,通常以 cls 作为第一个参数。

静态方法使用 @staticmethod 装饰器,因为没有self参数,所以它无法访问类的实例属性。也由于没有cls参数,所以它也无法访问类属性。因此,静态方法没有啥必须的参数...

实际使用中,选择哪种方法取决于个人的需求:

如果需要操作实例属性或需要实例上下文,使用实例方法。

如果需要访问类属性或执行与类相关的操作,使用类方法好。

如果需要一个与类和实例都无关的工具函数,可使用静态方法。

P.S.

胖中秋,盼国庆......(`へ´*)ノ

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenGL3.3_C++_Windows(36)

PBR_IBL镜面部分 镜面部分并不能像漫反射部分一样将BRDF部分像常量一样提取出来,因为它整个积分上不是常数,因为它受到wi和w0的影响,就比如一个x的等式,不能把x部分提取出来一样,他是随着等式变化的如果试图解算所有入…

uni-app开发日志:将schema2code生成的新增页和修改页整合成一页

有没有想过,add和edit页面其实没多大差别? 我之前自研的系统add和edit都是一个页面,只要判断一下当前有没有id传递来,为空来就是新增。 这样如果页面修改时,才能尽量少改动代码,少出错。 对比add.vue和edit…

企业海外新闻稿发布的转型之路:从纸媒到数字化

在全球化进程加速的今天,企业的传播渠道和方式也在经历着深刻的变革。曾经占据主导地位的纸质媒体,逐渐被灵活高效的海外媒体网站所取代。企业新闻稿发布形式的转变,不仅体现了技术进步和媒体环境的变化,也标志着企业全球传播战略…

日结兼职零工平台小程序系统开发制作方案

目前在大学生和自由职业者群体中,对短期兼职零工的需求日益增长。同时,企业与个人雇主也面临着季节性和临时性用工的需求。 日结兼职零工小程序系统为寻求日结工作的求职者和需要短期劳动力的企业提供一个快速匹配的平台。实现快速发布日结兼职工作信息…

5年经验社招后端面试经历分享

这是一位读者去年的面经,他在 2023 年在百度毕业,后面拿到了快手、滴滴和京东的 offer,最终选择了京东,薪资总包是 51w。 下面是正文。 背景介绍 大家好,本人 2018 年毕业于一所普通 211 学校,专业是软件…

【Redis】Redis 的消息队列 List、Streams—(六)

目录 一、消息队列二、List 方案三、Streams 方案 一、消息队列 我们一般把消息队列中发送消息的组件称为生产者,把接收消息的组件称为消费者,下图是一个通用的消息队列的架构模型: 消息队列在存取消息时,必须要满足三个需求&…

基于yolov10的PCB检测算法研究

内容:项目将YOLOV10创新后的PCB检测算法成功部署到GD32H757上,实现PCB缺陷的工业产线实时检测。 项目主要支持开源代码:HomiKetalys/gd32ai-modelzoo: Provide deployable deep learning models on gd32 (github.com) (想了解将…

群晖7.2.1 半洗白后安装AME

1. 群晖打开SSH 2. Xshell登录群晖 用管理员账户登录,然后使用sudo -i 获取root权限,sudo -i是要再次验证管理员密码 sudo -iSA6400还需要运行这个命令 /usr/syno/etc/rc.sysv/apparmor.sh stop #DSM7.2 AME版本3.1.0-3005强制解锁激活命令 curl -sk…

最常用集合 - ArrayList详解

ArrayList介绍 ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity)&…

MeshAnything V2来了!30秒生成建模师级Mesh!最大可生成面数提升至1600.

GitHub已揽星1.9k的MeshAnything项目上新了V2版本,由来自南洋理工大学、清华大学、帝国理工学院、西湖大学等研究人员完成。 MeshAnything V2相比V1,使用了最新提出的Adjacent Mesh Tokenization(AMT)算法,将最大可生…

mysql学习教程,从入门到精通,MySQL介绍(1)

1、MySQL 教程 本教程是为初学者准备的,以帮助他们理解与MySQL语言相关的基础知识和高级概念。 mysql MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系…

浏览器的高级搜索

一、背景 通常我们在浏览器搜索内容都是直接在输入框输入我们想要查询的内容,但是这样搜索出来的内容关联性不是很高,很多内容都是与我们搜索内容无关,会浪费我们大量的时间去查找内容。比如:我想要搜索网页中包含《游戏科学》这4…

kafak集群搭建-基于kRaft方式

kafak集群搭建-基于kRaft方式 1、服务器规划2、kafka集群部署配置2.1、解压三个kafka2.2、配置/config/kraft/server.properties 3、启动kafka集群4、SpringBoot集成kafka的kRaft集群4.1、消费者4.2、生产者4.3、配置类4.4、实体类4.5、JSON工具类4.6、项目配置文件4.7、测试类…

【web开发】Spring Boot 快速搭建Web项目

Date: 2024.08.30 13:52:20 author: lijianzhan 简述:【Spring Boot 快速搭建Web项目应用】是一篇关于Java Web项目构建的文章,主要讲解了如何借助Maven工具来管理和构建Web应用程序。Maven是Java开发中广泛使用的自动化构建工具,能够帮助开…

顺序循环队列

顺序循环队列 队头插入元素,队尾删除元素 本来应该判空和判断是否存满的条件都是:队头 队尾,但这样就没办法区分了,所以,就牺牲一个空间(比如长度为10,但只能存9个),这…

基层医疗云HIS系统源码:云计算、大数据等现代信息技术研发

云HIS源码,基层云HIS系统源码,基层医疗云HIS系统 利用云计算、大数据等现代信息技术研发的基层医疗云HIS系统实现了医院信息化从局域网向互联网转型,重新定义医疗卫生信息化建设的理念、构架、功能和运维体系。实现了医院信息化由局域网向互…

CAN协议通信 学习笔记

文章目录 1.CAN通信简介2.物理层2.1 CAN总线的电气特性2.2 CAN的位同步机制(了解,用于理解CAN的初始化参数的配置原理)硬同步方式重新同步方式 2.3 CAN对比其他常用协议的优势 3. 数据链路层3.1 CAN协议的数据帧3.2 仲裁机制3.3 访问控制3.4 …

python-FastApi框架

文章目录 FastApi一. 简介二. 特性三. 安装1. 安装fastapi模块2. 安装ASGI服务器( Uvicorn 或者 Hypercorn) 四. 实例1. 创建**main.py**文件(GET请求)2. 运行3. 测试4. 更新main_py(加入PUT请求) 五. 自动化API文档1. Swagger UI(交互式文档)2. ReDoc(可选式文档) FastApi 一…

华为云征文|Flexus云服务器X,云上性能新飞跃,开启业务增长新纪元

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,AWS/阿里云资深使用…

想告诉所有人,我找到脸书视频保存方法啦!

各位集美集帅们,我可算找到脸书视频的保存教学啦。作为社媒体人,在脸书看到有趣的素材却保存不了时真的要急的爆炸了。试了好多方式,这软件是最给力哒,我不管,下面的步骤介绍你一定要看完! 打开脸书&#x…