Python中的类与对象

✨前言✨

📘 博客主页:to Keep博客主页
🙆欢迎关注,👍点赞,📝留言评论
⏳首发时间:2023年12月11日
📨 博主码云地址:博主码云地址
📕参考书籍:《Python编程》
📢编程练习:牛客网+力扣网
由于博主目前也是处于一个学习的状态,如有讲的不对的地方,请一定联系我予以改正!!!

Python中的类与对象

  • 1 认识类与对象
  • 2 构造函数
  • 3 常见的内置方法
  • 4 封装
  • 5 继承
  • 6 类型注解
  • 7 多态
  • 8 类和对象综合案例

1 认识类与对象

在实际的生活中,每个学生都会有一个学号,一个名字,一个年龄,一个性别等属性!学生都会有一些相同的行为,比如吃饭,睡觉。那么对于这些共有的属性和行为,我们可以把这些共有的属性和行为抽取出来,形成一个模板,这就是类!就相当于是一张图纸,而对象就是根据图纸建造出来的实体!
类的语法格式

class 类名:
    成员变量
    成员方法(函数)

创建对象的格式

对象名 = 类名()

例子如下:

class Student:
    name = None
    Id = None
    age = None
    Sex = None

    def Eat(self):
        print("共有的行为吃饭")

    def Sleep(self):
        print("共有的行为睡觉")

    def running(self,hour,minute,second):
        print(f"{self.name}的跑步时间是{hour}{minute}{second}秒")

S1 = Student() #创建对象
#初始化对象的成员变量
S1.name = '张三'
S1.Id = '001'
S1.age = '18'
S1.Sex = '男'
#调用成员方法
S1.Eat()
S1.running(0,10,10)

注意:
1️⃣只要是成员方法,那么它的第一个参数必须是self,相当于C++中的隐藏this指针
2️⃣在调用成员方法时,self是自动默认传过去的,不可以显式的传过去
3️⃣访问成员变量必须通过self去访问,否则是访问不了的

2 构造函数

创建一个对象就要一行一行的去初始化,是不是太过于麻烦了,我们可以通过构造方法来进行初始化!构造函数就是帮助我们进行对象的初始化!它会在创建的时候就会自动调用构造函数,它的格式如下:

__(两条下划线后面也是两条下划线)init__(self,其他参数)

例子如下:

class Student:
    name = None
    Id = None
    age = None
    Sex = None

    def Eat(self):
        print("共有的行为吃饭")

    def Sleep(self):
        print("共有的行为睡觉")

    def running(self, hour, minute, second):
        print(f"{self.name}的跑步时间是{hour}{minute}{second}秒")

    #构造函数的使用
    def __init__(self,name,Id,age,Sex):
        #构造函数里也可以定义成员变量,这样前面的成员变量也可以不用定义
        self.name = name
        self.Id = Id
        self.age = age
        self.Sex = Sex


S1 = Student("张三","001",18,"男")  # 创建对象,并且自动调用构造函数
S1.Eat()
S1.running(0, 10, 10)

3 常见的内置方法

在python中,对于类和对象提供了一系列内置方法供我们进行使用!在此,我们只介绍几个比较常用的内置方法,例子如下:

class Student:
    name = None
    age = None

    def __init__(self,name,age):
        self.name = name
        self.age =age

    #可以将对象中的内容以字符串的形式输出  返回一个字符串类型
    def __str__(self):
        return f"你的名字是{self.name},你的年龄是{self.age}"

    #比较两个对象之间的大于或者是小于 返回值得到的是一个bool类型
    def __lt__(self,other):
        return self.age>other.age

    #比较小于等于或者是大于等于 返回值是一个布尔类型
    def __le__(self, other):
        return self.age>=other.age

    #用于两个类对象之间的相等比较 返回值是一个布尔类型
    def __eq__(self, other):
        return self.age == other.age

S1 = Student("张三",17)
S2 = Student("李四",18)
print(S1)
print(S1<S2)

4 封装

和其他语言类似,如果我们不想让别人访问到类中的成员变量或者是成员方法,在python中,我们可以在成员变量名或者是成员函数名前面加上两条下划线!通过这种方法来实现对某些成员变量和方法的封装!
例子如下:

在这里插入图片描述
这样的成员变量和成员方法,通过外部是访问或者调用不到的,但是我们可以通过写一个外部访问的到的成员函数来访问私有的成员变量或者是私有的方法!

5 继承

简单来说,继承就是一个类去继承了另一个类的成员变量和成员方法。去继承的类叫做子类,被继承的类一般被称为父类

语法如下:
class 子类类名(父类1,父类2……):
    成员变量
    成员方法

举个简单的例子如下所示:

class people:
    age = 10
    sex = "男"
    def running(self):
        print("会跑步")
class fish:
    length = 10
    age = 1

    def swim(self):
        print("会游泳")
class robot(people,fish):
    height = 1
    weight = 1
robot1 = robot()
robot1.running()
robot1.swim()
print(robot1.age)

关于继承有以下几个特点:

1️⃣继承可以有单继承也可以有多继承,多继承就是继承的父类不止有1个
2️⃣在继承中,可以通过子类对象来调用父类的成员变量和成员函数
3️⃣在多继承中,如果存在几个父类有相同的成员变量和成员函数,并且子类中没有这种成员变量和函数!那么就会根据继承的优先顺序(从左往右继承的优先级递减),来调用父类中的成员变量或者是成员函数!
4️⃣如果子类使用父类的成员变量或者是成员函数就已经足够了,我们可以使用pass语句来实现语法的填补!

有人认为父类的成员变量或者是成员方法写的并不够太好啊,此时我们就可以通过在子类中定义和父类一样同名的成员变量和成员函数,这就叫做复写,也就可以实现自己想要得到的成员变量和成员方法了

class father:
    set = '父类成员变量'

    def test(self):
        print("父类成员函数")

class son(father):

    set = '子类成员变量'

    def test(self):
        print("子类成员函数")

son1 = son()
print(son1.set)
son1.test()

复写之后是否还可以进行调用父类的成员变量或者是成员函数嘛!当然可以继续使用父类中的成员变量和成员函数

在子类中去调用父类的成员变量和成员方法:
方式一:父类名.成员变量/父类名.成员函数(self) 注:这里的self一定要显式的加上
方式二:super().成员变量/super().成员函数()

class father:
    set = '父类成员变量'

    def test(self):
        print("父类成员函数")

class son(father):

    set = '子类成员变量'

    def test(self):
        #方式一
        print(father.set)
        father.test(self)#调用父类的成员方法
        #方式二
        print(super().set)
        super().test()#调用父类的成员方法


son1 = son()
print(son1.set)
son1.test()

6 类型注解

所谓的类型注解,就是我们可以显式的定义变量,可以让pycharm快速的识别到这个是什么类型的,这样就可以调用这种类型对应的操作

#变量的类型注解
var_1:int = 1
var_2:str = 'abc'
#说明列表中全是整形
var_3:list[int] = [1,2,3,4]
#元组中设置类型详细注解,可以一一标注起来
var_4:tuple[str,int,int]=('abc',11,234)
#字典中进行类型注解,一个标注key,另一个标注value
var_5:dict[str,str]={"name":"张三"}
#自定义类型
var_6:student = student()
#函数的类型注解
def test(s1:int) -> int:  #-> int 表明返回值的类型
    return 10
print(test(2))
#Union联合注解
#导包
from typing import Union

#Union 联合类型注解
#说明key都是str类型,vakue是str或者是int类型
var_1:dict[str,Union[str,int]] ={"name":"张三","age":20}

def test() ->Union[int,str]:  #返回类型是int或者是str
    return 'str'

7 多态

简单来说多态就是传入不同的类对象,调用同一方法,而表现出不同行为的特点

class Animal:
	#父类的方法中不做具体实现,具体的实现交给子类去实现,这个叫做抽象方法,所在的类就是抽象类
    def speak(self):
        pass
class cat(Animal):
    def speak(self):
        print("猫会喵喵喵")
class dog(Animal):
    def speak(self):
        print("狗会汪汪汪")

def fun(animal:Animal):
    animal.speak()

dog = dog()
cat = cat()
fun(dog)
fun(cat)

甚至可以不在继承关系中,也就是我们所说的鸭子类型,只要该类对象中实现了一样的方法可以进行调用

class Animal:
    def speak(self):
        pass
class cat(Animal):
    def speak(self):
        print("猫会喵喵喵")
class dog(Animal):
    def speak(self):
        print("狗会汪汪汪")

def fun(animal:Animal):
    animal.speak()

class Duck:
    def speak(self):
        print("gagaga")

dog = dog()
cat = cat()
Duck = Duck()
fun(dog)
fun(cat)
fun(Duck)

8 类和对象综合案例

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

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

相关文章

mapstruct个人学习记录

mapstruct核心技术学习 简介入门案例maven依赖 IDEA插件单一对象转换测试结果 mapping属性Spring注入的方式测试 集合的映射set类型的映射测试map类型的映射测试 MapMappingkeyDateFormatvalueDateFormat 枚举映射基础入门 简介 在工作中&#xff0c;我们经常要进行各种对象之…

Qt简介、C++工程文件分离、创建Qt工程、Qt的帮助文档

QT 简介 core&#xff1a;核心模块&#xff0c;非图形的接口类&#xff0c;为其它模块提供支持 gui&#xff1a;图形用户接口&#xff0c;qt5之前 widgets&#xff1a;图形界面相关的类模块 qt5之后的 database&#xff1a;数据库模块 network&#xff1a;网络模块 QT 特性 开…

Android : Xui- RecyclerView+BannerLayout 轮播图简单应用

实例图&#xff1a; 1.引用XUI http://t.csdnimg.cn/Wb4KR 2.创建显示图片布局 banner_item.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"…

【线程池】的原理分析及源码(C语言版)

线程池的原理分析及源码&#xff08;C语言版&#xff09; centos8 连接失败 线程已满_张三和你一聊聊线程池 线程池 线程池是一种用于管理和复用线程的机制&#xff0c;通过线程池可以减少线程的创建和销毁次数&#xff0c;提高程序的性能和效率。线程池通常包含一个线程…

【第三届】:“玄铁杯”RISC-V应用创新大赛(基于yolov5和OpenCv算法 — 智能警戒哨兵)

文章目录 前言 一、智能警戒哨兵是什么&#xff1f; 二、方案流程图 三、硬件方案 四、软件方案 五、演示视频链接 总结 前言 最近参加了第三届“玄铁杯”RISC-V应用创新大赛&#xff0c;我的创意题目是基于 yolov5和OpenCv算法 — 智能警戒哨兵 先介绍一下比赛&#xf…

Spring日志完结篇,MyBatis操作数据库(入门)

目录 Spring可以对日志进行分目录打印 日志持久化&#xff08;让日志进行长期的保存&#xff09; MyBatis操作数据库(优秀的持久层框架) MyBatis的写法 开发规范&#xff1a; 单元测试的写法 传递参数 Spring可以对日志进行分目录打印 他的意思是说spring相关只打印INFO…

Android画布Canvas绘图scale,Kotlin

Android画布Canvas绘图scale&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.…

vuepress-----22、其他评论方案

vuepress 支持评论 本文讲述 vuepress 站点如何集成评论系统&#xff0c;选型是 valineleancloud, 支持匿名评论&#xff0c;缺点是数据没有存储在自己手里。市面上也有其他的方案, 如 gitalk,vssue 等, 但需要用户登录 github 才能发表评论, 但 github 经常无法连接,导致体验…

java实现网络聊天

网络聊天实现步骤&#xff08;从功能谈论方法&#xff09;&#xff1a; 客户端&#xff1a; 1.登录面板&#xff1a;注册提醒用户注册格式&#xff0c;登录账号密码不为空&#xff0c;点击登录的时候需要连接服务器端&#xff0c;启动聊天面板。&#xff08;监听用户点击登录…

logback的使用

1 logback概述 SLF4J的日志实现组件关系图如下所示。 SLF4J&#xff0c;即Java中的简单日志门面&#xff08;Simple Logging Facade for Java&#xff09;&#xff0c;它为各种日志框架提供简单的抽象接口。 SLF4J最常用的日志实现框架是&#xff1a;log4j、logback。一般有s…

LVS 三种负载均衡模式

昨天看视频了解LVS 三种负载均衡模式 &#xff0c;分别是Network Address Translation、Direct Routing、Tunneling 注&#xff1a;boardmix boardmix博思白板&#xff0c;多人实时协作的流程图&#xff0c;思维导图工具 https://boardmix.cn/ 画流程图还是很方便的

SSL 数字证书的一些细节

参考&#xff1a;TLS/SSL 协议详解(6) SSL 数字证书的一些细节1 证书验证 地址&#xff1a;https://wonderful.blog.csdn.net/article/details/77867063 参考&#xff1a;TLS/SSL协议详解 (7) SSL 数字证书的一些细节2 地址&#xff1a;https://wonderful.blog.csdn.net/articl…

Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

聚类算法的性能度量

聚类算法的性能度量 聚类算法就是根据数据中样本与样本之间的距离或相似度&#xff0c;将样本划分为若干组&#xff0f;类&#xff0f;簇&#xff0c;其划分的原则&#xff1a;簇内样本相似、簇间样本不相似&#xff0c;聚类的结果是产生一个簇的集合。 其划分方式主要分为两…

[GWCTF 2019]我有一个数据库1

提示 信息收集phpmyadmin的版本漏洞 这里看起来不像是加密应该是编码错误 这里访问robots.txt 直接把phpinfo.php放出来了 这里能看到它所有的信息 这里并没有能找到可控点 用dirsearch扫了一遍 ####注意扫描buuctf的题需要控制扫描速度&#xff0c;每一秒只能扫10个多一个都…

基于深度学习的超分辨率图像技术一览

超分辨率(Super-Resolution)即通过硬件或软件的方法提高原有图像的分辨率&#xff0c;图像超分辨率是计算机视觉和图像处理领域一个非常重要的研究问题&#xff0c;在医疗图像分析、生物特征识别、视频监控与安全等实际场景中有着广泛的应用。 SR取得了显著进步。一般可以将现有…

网络设备的健康检查方式

网络设备的健康检查方式 L3检查 通过ICMP来检查IP地址是否正常 L4检查 通过三次握手来检查端口号是否正常 L7检查 通过真实的应用通信来检查应用程序是否正常

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 CNN 部分

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 CNN 部分 概述CNN 简介数据预处理查看数据格式加载数据集 图像处理限定图像范围图像转换加载数据 CNN 模型Inception 网络ResNet 残差网络总结参数设置 训练 Train模型初始化数据加载训练超参数训练循环 验证…

实现Django Models的数据mock

目录 一、创建测试数据 二、使用随机数据 三、使用第三方库生成数据 四、编写测试用例 五、总结 在 Django 中&#xff0c;Model 是用于定义数据库表的结构的类。有时候&#xff0c;我们需要在测试或者开发过程中&#xff0c;模拟 Model 的数据&#xff0c;而不是直接从数…

springboot基础(80):redis geospatial的应用

文章目录 前言redis geospatial如何从地图上获取经纬度springboot 的相关方法调用准备redis服务器引用的依赖预设位置的keyGEOADD 添加位置GEORADIUS 获取指定经纬度附件的停车场&#xff08;deprecated&#xff09;GEORADIUS 获取指定成员附件的停车场&#xff08;deprecated&…