类与对象—python

news2024/9/27 17:30:51

一、类的含义

1.1类的作用(理解)

收集学生信息时,如果让同学们自主填写,信息的顺序、格式不一,内容混乱。如果发给同学们既定的表格,同学们按照规定的顺序、格式进行填写,那信息就会一目了然,如下图所示:

在程序中如果简单地使用变量来记录学生信息,不仅在创建变量,赋值这一步繁琐,在使用学生信息相关变量的时候,也非常不便,如下列代码所示:

#学生小明的信息
student_name1='小明'
student_ID1=10234049980
student_age1=19
student_year1=2021
student_class1='会计7班'
#学生小刚的信息
student_name2='小刚'
student_ID2=10234057760
student_age2=20
student_year2=2020
student_class2='土木3班'

类的作用就相当于上图中的表格,类相当于一个范式,在程序中也可以做到和生活中一样,以设计表格、生产表格、填写表格的形式组织信息,示例如下(此处看懂即可,语法在1.2中细讲):

#在程序中设计表格,我们称之为:设计类( class )
class Student_info:
    name=None      #学生姓名
    ID=None        #学生学号
    age=None       #学生年龄
    year=None      #学生年级
    classes=None   #学生班级

#在程序中打印生产表格,我们称之为:创建对象
stu1=Student_info()
stu2=Student_info()

#在程序中填写表格,我们称之为:对象属性赋值
stu1.name='小明'
stu1.ID=10234049980
stu1.age=19
stu1.year=2021
stu1.classes='会计7班'

这样写代码只是为了让大家理解类的角色,继续往下学习,可以将代码写得更简洁高效。

1.2类的语法

类由两部分组成,包括类的属性和类的行为。

语法:

class 类名称:

    类的属性

    类的行为

  • 类的属性:即定义在类中的变量(成员变量)
  • 类的行为:即定义在类中的函数(成员方法)

创建类对象的语法:

对象=类名称()

成员方法的定义语法:

def 方法名 (self,形参1,形参2,……):

    方法体

在方法定义的列表中,有一个self关键字,self关键字是成员方法定义时必须写的。

  • 它用来表示类对象自身的意思
  • 当我们使用类对象调用方法时, self 会自动被 python 传入
  • 在方法内部,想要访问类的成员变量,必须使用 self

我们利用类来描述书本信息(书名、作者、售价),示例如下:

#设计类( class )
class Book:
    #定义成员变量
    name=None   #书名
    author=None #作者
    price=None  #价格
    #定义成员方法
    def instru(self):
        print(f'《{self.name}》作者为{self.author},价格为{self.price}元')
#创建对象
book1=Book()
#赋值
book1.name='往昔之光'
book1.author='星河'
book1.price=20
#调用成员方法
book1.instru() #定义参数列表中只有self,调用时无须传参

输出:

《往昔之光》作者为星河,价格为20元

二、类和对象

类有属性和行为,现实世界的事物也有属性和行为,比如打扫卫生这件事,属性是:何人、何时、何地,行为是:擦桌子、扫地、拖地,或者又比如饮水机这个物体,属性是:颜色、体积、重量,行为是:烧水、保温。使用程序中的类,可以完美的描述现实世界的事物,那我们为什么还需要创建对象呢?
因为类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作,这种套路,称之为:面向对象编程。

例如我们要设计一款闹钟,代码如下所示:

#设计闹钟图纸——设计类
class Clock:
    ID=None    #序列号
    price=None #价格
    #响铃
    def ring(self):
        import winsound
        winsound.Beep(2000,3000)#声音频率,持续时间
#根据图纸进行生产——创建对象
clock1=Clock()
#使用对象的属性和行为(完成具体工作)
clock1.ID=123456
clock1.price=39
print(f'闹钟的ID为{clock1.ID},价格为{clock1.price}元')
clock1.ring()

运行代码后,会得到如下输出,且听到铃声。

闹钟的ID为123456,价格为39元

面向对象编程:设计类,基于类创建对象,由对象做具体的工作。

三、构造方法

Python 类内置的方法有很多,这些内置的类方法各自有各自特殊的功能,被称之为:魔术方法,我们主要了解以下5个方法即可。

3.1__init__( ) 方法

在给类对象赋值时,我们可以依次为对象的属性赋值,但是当属性较多时,就会比较麻烦。我们也可以只用一行代码进行赋值,高效地进行这个过程,此时就需要用到__init__( ) 方法。 __init__( ) 方法是Python 类中的构造方法之一,可以实现:

  • 在创建类对象(构造类)的时候,会自动执行。
  • 在创建类对象(构造类)的时候,将传入参数自动传递给 __init__ ( )方法使用。

借此特性可以给成员变量赋值所以我们才能完成只用一行代码进行赋值。

代码示例:

class Book:
    #定义成员变量
    name=None   #书名
    author=None #作者
    price=None  #价格
    # 定义成员方法
    def __init__(self,name,author,price):
        self.name=name     #书名
        self.author=author #作者
        self.price=price   #价格
        print(f'《{self.name}》作者为{self.author},价格为{self.price}元')
#创建对象并赋值
book2=Book('红楼梦','曹雪芹',79)#像传参一样,按顺序赋值

输出:

《红楼梦》作者为曹雪芹,价格为79元

注意:

  • init 前后都有 2 个下划线
  • 构造方法属于成员方法,要在参数列表中加上 self 关键字

我们可以写得更简略,在定义类的时候,定义成员变量这一步也可以省略:

class Book:
    
    # 定义成员方法
    def __init__(self,name,author,price):
        self.name=name     #书名
        self.author=author #作者
        self.price=price   #价格
        print(f'《{self.name}》作者为{self.author},价格为{self.price}元')
#创建对象
book2=Book('红楼梦','曹雪芹',79)

是否使用__init__ ( )方法可以对比一下:

3.2__str__ ( )方法

__str__ ( )字符串方法可以控制类对象转换为字符串。

我们先看这段代码:

#设计类
class Room:
    def __init__(self,desk,chair):
        self.desk = desk  # 桌子的数量
        self.chair=chair #椅子的数量
#创建对象并赋值
room1=Room(12,12)

print(room1)

打印类对象,获得的是其内存地址,输出如下:

<__main__.Room object at 0x0000020A8BB73D30>

使用__str__ ( )字符串方法,控制输出的内容,再次打印类对象,输出就是我们控制的内容:

#设计类
class Room:
    def __init__(self,desk,chair):
        self.desk = desk  # 桌子的数量
        self.chair=chair #椅子的数量

    def __str__(self):
        return f'桌子有{self.desk}张,椅子有{self.chair}个'
#创建对象并赋值
room1=Room(12,12)

print(room1)

输出:

桌子有12张,椅子有12个

3.3__lt__( )方法

直接对 2 个对象进行比较是不可以的,但是在类中实现 __lt__ 方法,即可同时完成:小于符号和 大于符号的比较。

  • 参数: other (另一个类对象)
  • 返回值: True 或 False(实际判断是否与方法中定义一致)

比如我们要比较职工的年龄:

代码示例:

#设计类
class staff():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __lt__(self,other):
        return self.age<other.age
#创建对象并赋值
sta1=staff('小明',24)
sta2=staff('小刚',26)
print(sta1<sta2)

输出:

True

3.4__le__( )方法

同__lt__( )方法类似, __le__( )方法用于 <= 和 >= 两种比较运算。

  • 参数: other (另一个类对象)
  • 返回值: True 或 False(实际判断是否与方法中定义一致)

代码示例:

#设计类
class staff():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __le__(self,other):
        return self.age<=other.age
#创建对象并赋值
sta1=staff('小明',23)
sta2=staff('小刚',26)
sta3=staff('小蓝',26)
sta4=staff('小雨',22)
print(sta1<=sta2) #小明比小刚年龄小,结果为True
print(sta2>=sta3) #小刚比小蓝年龄一样大小,结果为True
print(sta1<=sta4) #小明比小雨年龄大,结果为False

输出:

True
True
False

3.5__eq__( )方法

 __eq__ 方法,用于比较 2 个对象(指定的部分)是否相等。

  • 参数: other(另一个类对象)
  • 返回值: True 或 False
     

代码示例:

#设计类
class staff():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __eq__(self,other):
        return self.age==other.age
#创建对象并赋值
sta1=staff('小明',23)
sta2=staff('小刚',26)
sta3=staff('小蓝',26)
sta4=staff('小雨',22)

print(sta2==sta3) #小刚和小蓝年龄相等,结果为True

输出:

True

代码示例:

#设计类
class staff():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __eq__(self,other):
        return self.name==other.name
#创建对象并赋值
sta1=staff('小明',23)
sta2=staff('小刚',26)
sta3=staff('小蓝',26)
sta4=staff('小雨',22)

print(sta2==sta3) #小刚和小蓝姓名不同,结果为False

输出:

False

四、类型注解

类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。
主要功能:

  • 帮助第三方 IDE 工具(如 PyCharm )对代码进行类型推断,协助做代码提示
  • 帮助开发者自身对变量进行类型注释

我们在PyCharm中编写代码时,经常会出现如下图中的提示:

这是因为PyCharm能确定list1是列表类型,可以做出提示。

当PyCharm不能确定数据类型时,无法做成提示。如下图,定义一个函数 func ,接收一个参数 data,PyCharm不能确定data的类型,自然也无法提示。

当我们调用方法(内置模块提供的),进行传参的时候,按快捷键 ctrl + p 会弹出提示。

4.1变量的类型注解

为变量设置类型注解有2种方式。

4.1.1变量:类型

为变量设置类型注解的第一种方式,利用基础语法:变量:类型

如下列代码所示:

#基础数据类型注解
var1:int=10
var2:float=3.14
var3:bool=True
var4:str='apple'
#类对象类型注解
class Book:
    name=None   #书名
    author=None #作者
    price=None  #价格
book:Book=Book()
#基础容器类型注解
list1:list=[1,2,3,4]
tuple1:tuple=(1,2,3,4)
set1:set={1,2,3,4}
dict1:dict={'abc':666}
str1:str='apple'
#容器类型详细注解,对容器元素类型进行注解
list2:list[int]=[1,2,3,4]
tuple2:tuple[int,str,bool]=(1,'a',True)#元组类型设置类型详细注解,需要将每一个元素都标记出来
set2:set[int]={1,2,3,4}
dict2:dict[str,int]={'abc':666}#字典类型设置类型详细注解,需要 2 个类型,第一个是 key 第二个是value

注意:

  • 元组类型设置类型详细注解,需要将每一个元素都标记出来
  • 字典类型设置类型详细注解,需要标注 2 个类型,第一个是 key 第二个是value

4.1.2# type: 类型

为变量设置类型注解的第二种方式,在注释中进行类型注解,语法:# type: 类型

一般情况下变量的类型很容易一眼看出,无需注解,而在无法直接看出变量类型之时,最好添加变量的类型注解,如下列代码所示:

import json
import random
class Desk:
    ID=None
    price=None
desk=Desk #type:Desk

var5=random.randint(1,10) #type:int
var6=json.loads(data)     #type:dict[str,int]

4.2函数(方法)的类型注解

函数(方法)可以在两处地方添加注解:

  • 形参的类型注解
  • 返回值的类型注解

语法:

def 函数名(形参:类型,形参:类型,……,形参:类型)->返回值类型:

      函数体

代码示例:

def func1(x:int,y:int)->int:
    return x+y
a=func1(2,3)
print(a)  #a=5

4.3Union类型

列表,元组,集合,字典可以存储不同类型的数据,例如:list1=[1,'a',3.14],list1中有整数元素、字符元素、浮点数元素,那如何对list1进行类型注解呢?形如list1,就需要使用Union 联合类型注解。

使用 Union[ 类型 , ......, 类型 ]可以定义联合类型注解,Union 联合类型注解在变量注解、函数(方法)形参和返回值注解中,均可使用,使用方式如下:

  • 导包: from typing import Union
  • 语法: Union[ 类型 , ......, 类型 ]

代码示例:

from typing import Union
list3:list[Union[int,str,float]]=[1,'a',3.14]
dict3:dict[str,Union[str,int]]={'name':'加菲猫','age':3}

注意:

类型注解只是提示性的,并非决定性的,数据类型和注解类型无法对应也不会导致错误。

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

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

相关文章

回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SO-SVR蛇群算法优化支持向量机的数据多…

path_provider插件的用法

文章目录 1. 概念介绍2. 实现方法3. 示例代码我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值,如果遇到…

大数据-147 Apache Kudu 常用 Java API 增删改查

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【学习笔记】 AD24中元器件重叠系统不报错的解决方案(消除报错)

【学习笔记】 AD24中PCB设计元器件重叠后系统不报错的解决方案&#xff08;如何主动屏蔽报错&#xff09; 一、Component Clearance未开启使能的解决方案二、最小水平间距设置错误的解决方案三、未开启设计规则检查的解决方案四、设计规则检查中 “在线”和“批量”的含义五、为…

开源的CDN:jsDelivr+Github加速图片加载

文章目录 20240530更新 网站加载的图片耗时&#xff0c;将图片使用jsDelivr进行加速。 每次打开静态网站的时候&#xff0c;都会发现页面的内容已经加载出来了&#xff0c;但是图片还是一片白&#xff0c;就考虑如何让图片能够更快的加载出来。 后面发现可以用jsDelivr加速Gi…

自然场景文本定位系统源码分享

自然场景文本定位检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

南京市副市长吴炜一行至天洑软件参观调研

近日&#xff0c;南京市副市长吴炜、南京市工信局副局长代吉上、南京市科技局副局长王愿华、江宁开发区管委会副主任易骏飞一行至天洑软件参观&#xff0c;调研工业软件重点企业方案&#xff0c;天洑软件副总经理冯克列、总工程师郭阳、研发部部长谢佳雯陪同调研。 Q1&#xff…

南开大学联合同济大学发布最新SOTA Occ OPUS:使用稀疏集进行占据预测,最快实现8帧22FPS

Abstract 占据预测任务旨在预测体素化的 3D 环境中的占据状态&#xff0c;在自动驾驶社区中迅速获得了关注。主流的占据预测工作首先将 3D 环境离散化为体素网格&#xff0c;然后在这些密集网格上执行分类。然而&#xff0c;对样本数据的检查显示&#xff0c;大多数体素是未占…

Linux:编译,调试和Makefile

一丶vim编译器 ### 基本概念 模式&#xff1a;Vim有几种不同的模式&#xff0c;包括&#xff1a; 命令/正常/普通模式&#xff1a;控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动复制某区段及进入Insert mode下&#xff0c;或者到 last line mode 插入模…

xpath在爬虫中的应用、xpath插件的安装及使用

安装 1、打开谷歌浏览器进入扩展程序安装页面(右上角会有"开发者模式按钮")默认是关闭的&#xff0c;当安装此插件时需要把开发者模式打开。 2、下载下来的xpath_helper是zip格式的&#xff0c;需要解压缩即可安装。 3、重启浏览器&#xff0c;再次点击扩展程序即…

CAN通信详解

1、CAN介绍 1.1、什么是CAN? CAN&#xff08;Controller Area Network&#xff09; 即控制器局域网&#xff0c;是ISO国际标准化的串行通信协议。 开发目的&#xff1a;为了满足汽车产业的“减少线束的数量”、“通过多个LAN&#xff0c;进行大量数据的高速通信”…

9.25 C++继承 多态

手动实现队列 #include <iostream>using namespace std;class My_queue { private:struct Node //队列结构体{int data;Node *next;Node(int value):data(value),next(nullptr){}};Node *front;Node *rear;int size;public:My_queue():front(nullptr),rear(nullptr),siz…

EMQX MQTT 服务器启用 SSL/TLS 安全连接,使用8883端口

1.提前下载安装openssl 2.新建openssl文件夹打开在命令行操作 3.按照下面的操作进行 MQTT 安全 作为基于现代密码学公钥算法的安全协议&#xff0c;TLS/SSL 能在计算机通讯网络上保证传输安全&#xff0c;EMQX 内置对 TLS/SSL 的支持&#xff0c;包括支持单/双向认证、X.509 …

如何使用ssm实现线上旅游体验系统+vue

TOC ssm691线上旅游体验系统vue 绪论 课题背景 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化。目前&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得到提升&#xff0…

进制数知识(2)—— 浮点数在内存中的存储 和 易混淆的二进制知识总结

目录 1. 浮点数在内存中的存储 1.1 浮点数的大V表示法 1.2 浮点数的存储格式 1.3 浮点数的存入规则 1.4 浮点数的读取规则 1.5 补充&#xff1a;移码与掩码 1.6 题目解析 2. 易错的二进制知识 2.0 符号位到底会不会参与运算&#xff1f; 2.0.1 存储前的编码变化运算 …

【Zynq从零开始】汇总导航

Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆。…

《Object-Centric Learning with Slot Attention》中文校对版

系列论文研读目录 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列论文研读目录摘要引言2 方法2.1 插槽注意力模块2.2 对象发现2.3 集合预测 3 相关工作4 实验4.1 对象发现4.2 集合预测 5 结论更广泛的影响 摘要 学习复杂场景的以对象为中心的表示是…

erlang学习:Linux命令学习5

从本地上传文件 使用rz命令选择文件&#xff0c;将本地文件上传至linux服务器 rz与本地文件中的txt文本文件内容相同 将上传的文件按行分割 split -l 1 study.txt -d -a 1 study_-l:按行分隔&#xff0c;每1行对study.txt文件进行切割 -d:添加数字后缀 -a 1:以1位数数字做尾…

Java_Day03学习

Day03 构造方法目的 为类的属性赋值构造方法调用 //调用带参方法时&#xff0c;要先实例化类&#xff0c;创建对象再调用&#xff1b; eg&#xff1a;public class Max_and_Min {//方法:访问修饰符 返回类型 方法名(形式参数类型 形参&#xff0c;形参类型 形参) {}public v…

速刷DuckDB官网24小时-掌握核心功法

简介 DuckDB 是面向列的本地 OLAP 数据库&#xff0c;SQLite是面向行的本地 OLTP 数据库。duckdb是 数据分析师得力助手&#xff0c;可以很好的直接读取本地的各种结构化数据文件&#xff0c;速度显著快于主流的pandas等工具。 duckdb通过加载插件可以成为各种RDBMS数据库的中…