Python__面向对象__多态学习

目录

一、多态

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,pricedef __init__(self, size, brand, price):  self.size = size  # 实例属性赋值self.brand = brand  # 实例属性赋值self.cost = 50  # 成本价初始化为50self.price = price # 以下定义三个实例方法:on_season,off_season,current_pricedef 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 = sizeself.brand = brand# 每次创建衣物实例时,总数增加1Clothes.total_clothes += 1# 类方法,用于获取衣物的总数@classmethoddef 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 = sizeself.brand = brandself.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.rhkb.cn/news/412666.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IT管理员的秘密武器:高效管理服务器的远程控制软件

如果你出外勤却紧急需要一份文件,是不是有种热锅上蚂蚁的感觉。这时候如果能远程公司的电脑就能获得马上获得那份心心念念的文件咯。今天我就分享几款轻松好操作的远程控制工具帮你走出困境。 1.向日葵远程控制 链接直通车:https://down.oray.com 这个…

进程间通信----管道篇

目录 一丶 无名管道 1. 特点 2. 读写特性 3. 函数接口 二丶有名管道 1.特点: 2.函数接口 3. 读写特性 一丶 无名管道 1. 特点 1. 只能用于具有亲缘关系的进程之间的通信 2. 半双工的通信模式,具有固定的读端和写端 3. 管道可以…

4G手机智能遥控开关

什么是4G手机智能遥控开关 4G手机智能遥控开关作为现代智能家居与工业自动化的重要组成部分,提供了便捷、高效的远程控制方案。它利用4G通信技术,允许用户随时随地通过智能手机或其他移动设备控制电器设备的开关状态,适用于家庭、办公、工业等…

【Android】MotionLayout实现动画效果

【Android】MotionLayout实现开场动画 在移动应用开发中,动画不仅仅是美化界面的工具,它更是提升用户体验的关键手段。Android 平台一直以来都提供了丰富的动画框架,但随着应用复杂性的增加,开发者对动画的需求也变得更加复杂和多…

AcWing898. 数字三角形

线性DP 董晓老师的讲解是从下标0开始算的,其实我们从1开始也可以,我感觉这里从1开始更好理解。是从下往上计算的。j负责列的计算,往上计算时逐步收窄横向的范围,i是纵向的从下往上算, 下面是内存布局 下面是逻辑上的…

android 离线的方式使用下载到本地的gradle

1、android studio在下载gradle的时候,特别慢,有的时候会下载不完的情况,这样我们就要离线使用了。 2、下载Gradle Gradle | Releases 或者 Releases gradle/gradle GitHub Gradle | Releases 这里我们下载8.10 complete版本&#xff0c…

Tomcat10安装

Tomcat下载 进入官网下载https://tomcat.apache.org 注意tomcat版本和Java版本的对应关系: 配置好JAVA_HOME 安装tomcat前,需要先配置好JAVA_HOME,因为tomcat启动时候默认会找环境里面的JAVA_HOME,这里选择的Java版本是java1…

【工具篇】高效记忆方法之AnKi工具

😊你好,我是南极。正在变强的路上不断地努力着💪 🔔今天和大家分享一些记忆的方法,以及推荐了一款用于复习和巩固知识的软件AnKi。 对我们程序员而言,平常学习的东西会比较多,有时呢学的东西会…

结合代码详细讲解DDPM的训练和采样过程

本篇文章结合代码讲解Denoising Diffusion Probabilistic Models(DDPM),首先我们先不关注推导过程,而是结合代码来看一下训练和推理过程是如何实现的,推导过程会在别的文章中讲解;首先我们来看一下论文中的…

<C++> AVLTree

目录 1. AVL概念 2. AVL树节点的定义 3. AVL树的插入 4. AVL树的旋转 5. AVL树的验证 6. AVL树的删除 7. AVL树的性能 暴力搜索、二分搜索、二叉搜索树、二叉平衡搜索树(AVL、红黑树)、多叉平衡搜索树(B树)、哈希表 1. AVL概念 二…

【C++ Primer Plus习题】7.2

问题: 解答: #include <iostream> using namespace std;#define MAX 10int input(float* grade, int len) {int i 0;for (i 0; i < len; i){cout << "请输入第" << i 1 << "个高尔夫成绩(按0结束):";cin >> grade[i]…

更改了ip地址怎么改回来

在日常的网络使用中&#xff0c;‌我们有时会因为特定的需求更改设备的IP地址&#xff0c;‌比如解决IP冲突、‌访问特定网络资源或进行网络测试等。‌然而&#xff0c;‌更改IP地址后&#xff0c;‌我们可能又因为某些原因需要将IP地址改回原来的设置。‌本文将详细介绍如何改…

视频号单场直播GMV超500万!开学季助力品牌高效转化

开学在即&#xff0c;友望数据发现&#xff0c;不少学习机、学练机、智能机器人、词典笔等学习相关的电子教育产品开始畅销 ▲ 图片来源&#xff1a;友望数据-商品排行榜 新学年开始&#xff0c;家长们又要为孩子新的学业操碎心&#xff0c;而教育培训商家也在开学季迎来了他们…

PS如何抠人像图--5步实现完美抠图

1、菜单栏--选择--选择主体 2、菜单栏--选择--选择并遮住 3、选择原图--右下角添加纯色背景 4、文件--导出--导出为png图片 5、原图与抠图效果对比 相关参考视频&#xff1a; 【ps教程】揭秘PS抠头发&#xff0c;这才是真正的教学&#xff0c;快收藏吧_哔哩哔哩_bilibili 一分…

挂载5T大容量外接硬盘到ubuntu

挂载5T大容量外接硬盘到ubuntu S1&#xff1a;查看硬盘 使用 $ sudo fdisk -l找到对应盘&#xff0c;例如下图所示 /dev/sdc S2: 创建分区 使用 $ sudo fdisk /dev/sdc对上硬盘进行创建分区&#xff1b;可以依次使用以下指令 m &#xff1a;查看命令&#xff1b; g &…

从开题到答辩:ChatGPT超全提示词分享!(下)【建议收藏】

数据收集 1. "请帮我找出关于如何收集【研究领域】社交媒体数据进行消费者行为研究的五篇指导性文章&#xff0c;并概述它们的主要方法论摘要。" 2. "我需要对【特定领域】市场的消费者偏好进行调查。能否提供一份包含调查问卷设计原则和示例的草稿&#xff1f;…

cola_os学习笔记(下)

cola_os学习笔记&#xff08;上&#xff09; os文件夹 cola_device.c ​ .h放在.c的同层级。作者采用了字符设备注册的方式&#xff0c;在.h中可以看到设备属性。也就是把LED这些设备抽象&#xff0c;外面传入"LED1"这样的参数&#xff0c;使我联想到java的new一个…

编译错误cc:not found总结

一、错误 cc: not found 系统无法找到名为cc的编译器。 注&#xff1a;在大多数Linux系统中&#xff0c;cc通常是C编译器的链接&#xff08;link&#xff09;或别名&#xff0c;它通常指向gcc&#xff08;GNU Compiler Collection&#xff09;或其他C编译器。 二、可能导致…

「OC」CAlayer——巧用动画实现一个丝滑的折叠cell

「OC」CAlayer——巧用动画实现一个丝滑的折叠cell 前言 在这个暑假集训后的时间&#xff0c;都在家里做着学习笔记的整理&#xff0c;深入学习了CALayer的相关知识&#xff0c;掌握了第三方库Masonry自动布局的用法&#xff0c;以及学习了MVC的相关内容&#xff0c;正好组内…

chapter08-面向对象编程——(Object类详解)——day09

目录 319-运算符 320-查看Jdk源码 321-子类重写equals 322-equals课堂练习1 323-equals重写练习2 324-equals重写练习3 325-hashCode 326-toString 327-finalize 319-运算符 引用的都是同一个地址&#xff0c;所以返回true 320-查看Jdk源码 equals只能判断引用类型是…