Python小白学习教程从入门到入坑------第二十五课 多态(语法进阶)

一、多态

含义:指同一种行为具有不同的表现形式

一个对象具有多种形态,在不同的使用环境中以不同的形态展示其功能,那我们就称该对象具有多态特征

eg:+ 号在不同的使用环境中,有着不同的功能

print(10+10)      # 算术运算符:可以实现整型之间的相加操作
print('10'+'10')  # 字符串拼接:实现字符串之间的拼接操作

1.1 多态的前提

前提:

1、继承

2、重写

多态的特点:

1. 不关注对象的类型,关注对象具有的行为,也就是对象的实例方法是否同名

2. 多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强

3. 不同的子类对象,调用相同的父类方法,会产生不同的执行结果

eg:在子类中,同一种方法shout,有不同的表现形式

class Animal(object):"""父类:动物类"""def shout(self):print("动物会叫")
class Cat(Animal):"""子类一:猫类"""def shout(self):print("小猫喵喵喵")
class Dog(Animal):"""子类二:狗类"""def shout(self):print("小狗汪汪汪")
cat = Cat()
cat.shout()
dog = Dog()
dog.shout()
# 输出内容:
# 小猫喵喵喵
# 小狗汪汪汪

1.2 多态性

多态性:一种调用方法,不同的执行结果

eg:test 函数传入不同的对象,执行不同对象的eat方法

class Animal(object):def eat(self):print("我会干饭")
class Pig(Animal):def eat(self):print("猪吃猪饲料")
class Dog(Animal):def eat(self):print("狗吃狗粮")
# 多态性:定义一个统一的接口,一个接口多种实现
def test(obj):   # 形参objobj.eat()
animal = Animal()
pig = Pig()
dog = Dog()
test(animal)
test(pig)
test(dog)
# 输出内容:
# 我会干饭
# 猪吃猪饲料
# 狗吃狗粮

二、静态方法

使用@staticmethod 来进行修饰,静态方法没有self、cls(后面会讲到)参数的限制

注意:静态方法与类无关,可以被转换成函数使用

在静态方法中,取消了不必要的参数传递,有利于减少不必要的内存占用和性能消耗

2.1 基本格式

定义格式:

class 类名:@staticmethoddef 方法名(形参):方法体

调用格式:

类名.方法名(实参)
对象名.方法名(实参)

2.2 静态方法实例 

eg1:静态方法既可以使用对象访问,也可以使用类访问

class Person(object):@staticmethod    # 静态方法def study():print("人类会学习")
# 静态方法既可以使用对象访问,也可以使用类访问
Person.study()  # 输出:人类会学习
pe = Person()
pe.study()      # 输出:人类会学习

eg2:静态方法中也可以传参

class Person(object):@staticmethod    # 静态方法def study(name):print(f"{name}会学习")
Person.study('junjun')  # 输出:junjun会学习
pe = Person()
pe.study('junjun')      # 输出:junjun会学习,调用方法时传参数

三、类方法

使用装饰器@classmethod 来标识为类方法,对于类方法,第一个参数必须是类对象,一般是以cls作为第一个参数

注意:

1、当方法中需要使用到类对象(如访问私有类属性等),定义类方法
2、类方法一般是配合类属性使用

定义格式:

class 类名:@classmethoddef 方法名(cls,形参):方法体

eg:类方法内部可以访问类属性,或者调用其他的类方法

class Person(object):name = "junjun"@classmethoddef sleep(cls):print("cls",cls)  # cls代表类对象本身,类本质上就是一个对象print("人类在睡觉")print(cls.name)
print(Person)
Person.sleep()
# 输出结果:
# <class '__main__.Person'>
# cls <class '__main__.Person'>
# 人类在睡觉
# junjun

四、总结

在类里面定义方法有三种:实例方法、静态方法、类方法

1.实例方法:方法内部访问实例属性,方法内部可以通过类名.类属性名来访问类属性

2.静态方法@staticmethod:方法内部,不需要访问实例属性和类属性,如果要访问类属性,通过类名.类属性名访问,不能访问实例属性

3.类方法@classmethod:方法内部只需要访问类属性,可以通过cls.类属性名访问类属性,不能访问实例属性

实例方法:

实例方法是绑定到类的实例上的方法。它们必须通过类的实例来调用,并且它们的第一个参数通常是self,指向调用该方法的实例本身。

eg:

class MyClass:  def instance_method(self):  print(f"这是一个实例方法,调用者是:{self}")  # 创建类的实例  
obj = MyClass()  
# 调用实例方法  
obj.instance_method()  # 输出:这是一个实例方法,调用者是:<__main__.MyClass object at 0x...>

静态方法:

静态方法不依赖于类或实例,它们既不接收self也不接收cls作为第一个参数。它们通常用于在逻辑上属于类但不需要访问或修改类或实例状态的函数。静态方法使用@staticmethod装饰器来定义。

eg:

class MyClass:  @staticmethod  def static_method():  print("这是一个静态方法,不依赖于类或实例")  # 直接通过类调用静态方法  
MyClass.static_method()  # 输出:这是一个静态方法,不依赖于类或实例  
# 也可以通过实例调用静态方法,但这不是必需的  
obj = MyClass()  
obj.static_method()  # 输出同上

类方法:

类方法绑定到类本身而不是类的实例。它们接收cls作为第一个参数,cls指向调用该方法的类本身。类方法使用@classmethod装饰器来定义,常用于创建或修改类级别的变量或执行类级别的操作。

eg:

class MyClass:  class_variable = 0  @classmethod  def class_method(cls):  print(f"这是一个类方法,调用者是:{cls}")  cls.class_variable += 1  print(f"类变量现在的值是:{cls.class_variable}")  # 通过类调用类方法  
MyClass.class_method()  # 输出:这是一个类方法,调用者是:<class '__main__.MyClass'> 类变量现在的值是:1  
# 通过实例调用类方法,虽然不推荐,但也可以  
obj = MyClass()  
obj.class_method()  # 输出:这是一个类方法,调用者是:<class '__main__.MyClass'> 类变量现在的值是:2

联系:

1、所有的方法都可以访问类级别的属性(即类变量)

2、所有的方法都可以通过类名或实例名来调用(尽管对于实例方法和类方法,通过类名调用时需要传递实例或类本身作为第一个参数)

3、实例方法可以直接访问和修改实例属性,而静态方法和类方法则不能直接访问实例属性(除非通过其他方式传入)。

区别:

实例方法:第一个参数是self,必须通过实例调用

静态方法:无self或cls参数,可以通过类或实例调用,不依赖于类或实例

类方法:第一个参数是cls,代表类本身,可以通过类或实例调用

今天的分享就到这里了,希望能帮助到大家~

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

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

相关文章

【C++】C++17结构化绑定、std::optional、std::variant、std::any

二十二、C17中的结构化绑定、std::optional、std::variant、std::any 本部分是一个小系列&#xff0c;介绍C17中新引入的、用来解决各种不同返回情况的、标准库新组件。 1、C的结构化绑定 结构化绑定structured bindings是C17中引入的一项特性&#xff0c;它允许开发者方便地…

ntkrnlmp.exe导致蓝屏死机的解决方法

在使用Windows操作系统的过程中&#xff0c;用户可能会遇到由ntkrnlmp.exe文件错误引发的蓝屏死机&#xff08;Blue Screen of Death, BSOD&#xff09;问题&#xff0c;这不仅影响了日常的工作效率&#xff0c;也可能造成数据丢失的风险。本文将为您提供一系列即时排查与修复n…

U3D游戏开发之骨骼动画相关

目录 1 作为U3D程序如何制作骨骼动画 2 骨骼动画程序代码相关 这个内容我在很久之前就想写了&#xff0c;很多项目也与骨骼动画挂钩&#xff0c;今天我们揭秘的是2D骨骼动画。来聊一聊大家可能非常关注的两个问题&#xff1a;作为程序如何制作骨骼动画&#xff1f;接到美术的骨…

java:题目:用Java实现简单的自取取款操作

import java.util.Scanner; public class ATM {public static void main(String[] args){//自主取款主类Scanner scnew Scanner(System.in);System.out.println("请输入账户号码&#xff1a;");String BankAccoutsrsc.nextLine();/BankAccout3 newBankAccoutnew Bank…

VLAN 高级技术 ——QinQ的配置

QinQ的概述&#xff1a; QinQ技术是一种扩展虚拟局域网&#xff08;VLAN&#xff09;数量空间的技术&#xff0c;通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来实现。以下是对QinQ技术的详细概述&#xff1a; QinQ技术的定义与背景 定义&#xff1a;QinQ&#xff08…

不得不承认供电公司信息宣传向媒体投稿的好方法找到了

初入国网供电公司,我被分配到了信息宣传部门,负责每月的信息宣传投稿任务。这项任务看似简单,实则充满挑战。一开始,我满怀热情,以为只要写出高质量的文章,就能顺利发表。然而,现实给了我当头一棒。传统的邮箱投稿方式,不仅竞争压力大,审核严格,而且周期漫长。每次投稿后,我总是…

『YOLOV5』| 一文搞定训练过程中的意外终止、以及想继续增加训练轮数!

文章目录 情况一&#xff1a;意外训练中断&#xff08;程序未训练完成&#xff0c;想完成目标训练轮数&#xff09;情况二&#xff1a;自动训练完成&#xff08;程序已完成训练&#xff0c;想增加训练轮数&#xff09; 情况一&#xff1a;意外训练中断&#xff08;程序未训练完…

GCC编译器的`-Wall`、`-Wextra`和`-pedantic`选项解读

gcc是广泛使用的开源编译器&#xff0c;-Wall、-Wextra和-pedantic是gcc中用于控制警告信息的选项&#xff0c;以下是详细介绍&#xff1a; -Wall&#xff08;启用大部分警告&#xff09; 功能&#xff1a;-Wall 选项用于启用一系列常用的警告信息&#xff0c;这些警告能帮助…

MMBench-Video:上海 AI Lab 联合多所高校推出长视频理解基准测试工具,全面评估 LVLMs 视频理解的能力

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

高频电子线路---调角频谱与频宽

目录 调角频谱(FM单频调制) 带宽 调频方法 直接调频方法与电路 变容二极管 如何提升频偏? 1. 增大调制信号的幅度&#xff08;增大调制深度&#xff09; 2. 提高调制信号的频率 3. 提高调制深度&#xff08;调制指数&#xff09; 4. 增加发射功率 5. 使用特殊的调制…

摘要、数字签名、对称加密、非对称加密综合应用示例以及技术原理说明

图&#xff1a;介绍了数字信封的安全传输过程 关键术语 散列&#xff1a;Hash&#xff08;哈希&#xff09;&#xff0c;一般翻译做散列、杂凑&#xff0c;是把任意长度的输入&#xff08;数据信息&#xff09;通过散列算法变换成固定长度的输出&#xff0c;该输出就是散列值…

java学习3---面向对象

一、设计对象并使用 1.类和对象 类是共同特征的描述&#xff1b;对象是真实存在的具体实例。 2.类的几个补充注意事项 二、封装 对象代表什么&#xff0c;就得封装对应的数据&#xff0c;并提供数据对应的行为。 封装告诉我们如何正确的设计对象 三、this关键字 this可以区…

Maven

Maven 命令方式构建项目 mvn compile&#xff1a;编译项目&#xff0c;生成target文件&#xff08;不编译测试代码&#xff09; mvn package&#xff1a;打包项目&#xff0c;生成jar或war文件&#xff08;不指定默认jar包&#xff09; mvn clean&#xff1a;清理编译或打包后…

leetcode 173.二叉搜索树迭代器

1.题目要求: 2.题目代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nu…

vue插件清除 所有console.log()

一、作用 1、提升性能console.log() 语句会消耗一定的性能&#xff0c;尤其是在频繁调用的情况下。在生产环境中移除这些语句可以提高应用的运行效率。 2、减少信息泄露console.log() 可以输出敏感信息&#xff08;如用户数据、API 响应等&#xff09;。在生产环境中&#xf…

Day102漏洞发现-漏扫项目篇Poc开发Yaml语法插件一键生成匹配结果交互提取

知识点&#xff1a; 1、Nuclei-Poc开发-环境配置&编写流程 2、Nuclei-Poc开发-Yaml语法&匹配提取 3、Nuclei-Poc开发-BurpSuite一键生成插件 Nuclei-Poc开发-环境配置&编写流程 1、开发环境&#xff1a;VscodeYaml插件 Visual Studio Code - Code Editing. R…

【IEEE出版】第六届国际科技创新学术交流大会暨信息技术与计算机应用学术会议(ITCA 2024,12月06-08)

第六届国际科技创新学术交流大会暨信息技术与计算机应用学术会议&#xff08;ITCA 2024) 2024 6th International Conference on Information Technology and Computer Application 会议官网&#xff1a;itca2024.iaecst.org 会议时间&#xff1a;2024年12月06-08日 截稿时…

聊一聊Spring中的@Scheduled注解

一、样例 1.1 demo代码 package com.lazy.snail;import org.springframework.stereotype.Component; import org.springframework.scheduling.annotation.Scheduled;/*** ClassName MyTask* Description TODO* Author lazysnail* Date 2024/10/29 17:56* Version 1.0*/ Compo…

如何高效集成每刻与金蝶云星空的报销单数据

每刻报销单集成到金蝶云星空的技术实现 在企业日常运营中&#xff0c;费用报销和付款申请是两个至关重要的环节。为了提升数据处理效率和准确性&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将每刻系统中的报销单数据无缝对接到金蝶云星空的付款申请单中。本案例将详…

使用量化分析微信小程序工具“梦想兔企业智能风险分析助手”日常操作日记-3-预制菜-惠发食品(603536)

使用量化分析微信小程序工具“梦想兔企业智能风险分析助手”日常操作日记-预制菜。 直接看截图&#xff1a; 1.第一步&#xff1a; 查看产业链&#xff0c;选择查看“中国预制菜行业”&#xff0c;政策支持&#xff0c;热点 查看预制菜产业链 这里我选择了中游-生产商 到行业…