Python基础之类

news2024/11/18 7:50:59

一:什么是类

类即类别/种类,是面向对象分析和设计的基石,如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。有了类的好处是:我们可以把同一类对象相同的数据与功能存放到类里,而无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大地节省了空间。所以,如果说对象是用来存放数据与功能的容器,那么类则是用来存放多个对象相同的数据与功能的容器。

 类:可以理解成一个模板

实例:根据模版创建出来的一个对象

属性:这类东西具有的特征,例如:汽车的重量,品牌

方法:这类东西可以做的事情,例如:汽车可以刹车

必须要事先定义类,然后再调用类产生对象(调用类拿到的返回值就是对象)

二、类的定义与实例化

使用关键字class定义类

将共有属性提取到:init初始化函数中

定义共有的方法

class Student:
    
    school = '华阳中学'

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

    def choose(self):
        print(f'{self.name} is choosing a course')

调用类的过程就是类的实例化,拿到的返回值就是程序中的一个对象,或称为一个实例

stu1 = Student("json", 20, "男")   # 每实例化一次Student类就得到一个学生对象
stu2 = Student("lili", 21, "女")
stu3 = Student("jack", 19, "男")

单拿stu1的产生过程来分析,调用类会先产生一个空对象stu1,然后将stu1连同调用类时括号内的参数一起传给Student.__init__(stu1,"json", 20, "男")

def __init__(self, name, age, sex):
    self.name = name  # stu1.name = 'json'
    self.age = age    # stu1.age = 20
    self.sex = sex    # stu1.sex = '男'

会产生对象的名称空间,同样可以用__dict__查看

print(stu1.__dict__)
# {'name': 'json', 'age': 20, 'sex': '男'}

我们造出了三个对象(实例)与一个类,对象(实例)存放各自独有的数据,类中存放对象(实例)们共有的内容。

三、访问属性

3.1:类属性与实例属性

在类中定义的名字,都是类的属性,分为两种:数据属性和函数属性。可以通过__dict__访问属性的值,比如Student.__dict__[‘school’],但Python提供了专门的属性访问语法。

print(Student.school)   # 访问数据属性,等同于Student.__dict__[‘school’]
# 华阳中学
print(Student.choose)   # 访问函数属性,等同于Student.__dict__[‘choose’]
# <function Student.choose at 0x100588940>

操作对象属性也是一样的

print(stu1.name)   # 查看,等同于stu1.__dict__[‘name’]
# json
stu1.course = '语文'    # 新增,为stu1新增course属性,等同于stu1.__dict__[‘course’] = '语文'
print(stu1.course)  # 语文
stu1.age = 22      # 修改,修改stu1的age属性,等同于stu1.__dict__[‘age’] = 22
print(stu1.age)    # 22
del stu1.course    # 删除,删除stu1的course属性
print(stu1.course)  # 抛异常:AttributeError: 'Student' object has no attribute 'course'

当类的数据属性为不可变类型(字符串、数字、元组)时,通过修改实例对象的数据属性的值,不会修改类的数据属性的值,也不会修改其他实例对象属性的值;通过类去修改数据属性的值,会改变所有实例对象的属性的值;

当类的数据属性为可变类型(列表、字典、集合)时,修改实例对象的数据属性的值,会修改类的数据属性的值,同时也会修改其他实例对象属性的值;通过类去修改数据属性的值,会改变所有实例对象的属性的值;

class Student:

    school = '华阳中学'
    course = []

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

    def choose(self):
        print(f'{self.name} is choosing a course')

stu1 = Student("json", 20, "男")   # 每实例化一次Student类就得到一个学生对象
stu2 = Student("lili", 21, "女")

修改实例对象中不可变的类属性:

print(Student.school)    # 华阳中学
print(stu1.school)       # 华阳中学
print(stu2.school)       # 华阳中学
stu1.school = '成都七中'
print(Student.school)    # 华阳中学
print(stu1.school)       # 成都七中
print(stu2.school)       # 华阳中学

通过类修改不可变的类属性:

print(Student.school)     # 华阳中学
print(stu1.school)        # 华阳中学
print(stu2.school)        # 华阳中学
Student.school = '成都七中'
print(Student.school)     # 成都七中
print(stu1.school)        # 成都七中
print(stu2.school)        # 成都七中

修改实例变量中可变类型的值:

print(Student.course)      # ['语文']
print(stu1.course)         # ['语文']
print(stu2.course)         # ['语文']
stu1.course.append('数学')
print(Student.course)      # ['语文', '数学']
print(stu1.course)         # ['语文', '数学']
print(stu2.course)         # ['语文', '数学']

通过类修改可变类型的类属性:

print(Student.course)      # ['语文']
print(stu1.course)         # ['语文']
print(stu2.course)         # ['语文']
Student.course.append('英语')
print(Student.course)      # ['语文', '英语']
print(stu1.course)         # ['语文', '英语']
print(stu2.course)         # ['语文', '英语']

3.2:属性查找顺序与绑定方法

对象的名称空间里只存放着对象独有的属性,而对象们相似的属性是存放于类中的。对象在访问属性时,会优先从对象本身的__dict__中查找,未找到,则去类的__dict__中查找。

1、类中定义的变量是类的数据属性,是共享给所有对象用的,指向相同的内存地址。

print(id(Student.school))
# 4376459376
print(id(stu1.school))
# 4376459376
print(id(stu2.school))
# 4376459376

2、类中定义的函数是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数。

Student.choose(stu1)
# json is choosing a course
Student.choose(stu2)
# lili is choosing a course

但其实类中定义的函数主要是给对象使用的,而且是绑定给对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法,内存地址各不相同。

print(id(Student.choose))
# 4368304448
print(id(stu1.choose))
# 4368328576
print(id(stu2.choose))
# 4368328576

绑定到对象的方法特殊之处在于,绑定给谁就应该由谁来调用,谁来调用,就会将’谁’本身当做第一个参数自动传入(方法__init__也是一样的道理)

stu1.choose()     # 等同于Student.choose(stu1)
# json is choosing a course
stu2.choose()     # 等同于Student.choose(stu2)
# lili is choosing a course

注意:绑定到对象方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但命名为self是约定俗成的。

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

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

相关文章

【AI绘画】Midjourney的使用及程序示例

Midjourney 1.背景2.Midjourney的原理3.Midjourney的使用方法4.Midjourney的示例代码 1.背景 Midjourney 是一款基于深度学习的图像转换工具&#xff0c;其可以将一张图像转换成具有不同风格的图像&#xff0c;例如将一张照片转换成卡通风格的图像。Midjourney 基于 TensorFlow…

Jetson Nano一步到位打开USB摄像头(Rosmaster小车)

背景&#xff1a;我用的rosmaster r2小车配的摄像头是Astra pro&#xff0c;也就是下图这款&#xff1a; 1. 支持的摄像头 Jetson开发包有多个用于连接相机的接口&#xff0c;包括USB、以太网和MIPI CSI-2。流行的相机是现成的支持&#xff0c;而Jetson生态系统合作伙伴支持广…

基于树莓派的OpenEuler基础实验二

文章目录 基于树莓派的OpenEuler基础实验二一、ROS中间件介绍1. ROS话题通信与服务通信2. 常见的ROS终端命令 二、中间件基础实验1. ROS的移植2. ROS的安装和环境配置3. 第一个ROS实践之开启小海龟4. ROS话题实践1&#xff09;ROS工作区与软件包的创建2&#xff09;ROS的话题通…

可能是最强的Python可视化神器,建议一试

数据分析离不开数据可视化&#xff0c;我们最常用的就是Pandas&#xff0c;Matplotlib&#xff0c;Pyecharts当然还有Tableau&#xff0c;看到一篇文章介绍Plotly制图后我也跃跃欲试&#xff0c;查看了相关资料开始尝试用它制图。 Plotly Plotly是一款用来做数据分析和可视化的…

《商用密码应用与安全性评估》第二章政策法规2.4商用密码应用安全性评估工作

商用密码应用安全性评估体系发展历程 第一阶段&#xff1a;制度奠基期&#xff08;2007年11月至2016年8月&#xff09; 第二阶段&#xff1a;再次集结期&#xff08;2016年9月至2017年4月&#xff09; 第三阶段&#xff1a;体系建设期&#xff08;2017年5月至2017年9月&…

【Vue3】vue3中的watchEffect使用及其他的API

目录 一&#xff0c;watchEffect 二&#xff0c;生命周期 三&#xff0c;什么是hooks? 四&#xff0c;toRef 五&#xff0c;其他组合式API 5.1shallowReactive&shallowRef 5.2readonly&shallowReadonly 5.3.toRaw&markRaw 5.4自定义Ref-customRef ​5.5pr…

SSM框架整合之单表操作

1、Spring和Spring MVC父子容器 概念介绍 1.在Spring与SpringMVC进行整合的时候&#xff0c;一般情况下我们会使用不同的配置文件来配置Spring和SpringMVC&#xff0c;因此我们的应用中会存在至少2个ApplicationContext的实例&#xff0c;由于是在Web应用中&#xff0c;因此最…

基于Html+Css的图片展示26

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

AlgoC++第五课:基于矩阵的算法实现

目录 基于矩阵的算法实现前言1. 矩阵2. 矩阵求导推导3. 矩阵示例代码3.1 Matrix.hpp3.2 Matrix.cpp3.3 main.cpp3.4 拓展-cblas_sgemm3.5 拓展-LU分解 4. 多元线性回归5. 多元逻辑回归6. 最小二乘法7. 岭回归(L2)8. 多元牛顿法9. 高斯牛顿法10. Levenberg-Marquardt(修正牛顿法…

[Platforimio] LVGL +TFT_eSPI实现触摸功能

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识&#xff0c;如果大家喜欢&#xff0c;别忘点个赞加个关注哦&#xff0c;让我们一起共同进步~ &#x…

Centos下环境变量

文章内容如下&#xff1a; 1&#xff09;什么是环境变量&#xff1b; 2&#xff09;如何通过程序获取环境变量&#xff1b; 3) 常识规律 一。环境变量的定义 环境变量就是指一段路径。 定义环境变量主要是为了方便的执行程序。添加环境变量的方法是export PATH$PATH:/A/B&…

医用IT隔离电源在医院特殊场所接地系统的应用

【摘要】我们国家大部分医院的临床救治和确诊都是利用了医疗电气类设备和医用的医疗仪器&#xff0c;因此这些地方的接地问题应该引起我们的高度的重视。IT系统主要是利用了中性点没有直接接地的方式&#xff0c;所以可以减少电压和电流&#xff0c;从而使人类触电的可能性小之…

搭建Serv-U FTP服务器共享文件外网远程访问「无公网IP」

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转载自内网穿透工具的文章&#xff1a;使用Serv-U搭建FTP服务器并公网访问【内网穿透】 1. 前言…

Midjourney教程(三)——Prompt常用参数

Midjourney教程——Prompt常用参数 为了提升prompt的准确度与输入效率&#xff0c;让midjourney能够生成我们理想中的图片&#xff0c;我们需要学习一下prompt的常用参数 Version version版本号&#xff0c;midjourney支持多种模型&#xff0c;我们可以通过version参数来选择…

字典树(Trie/前缀树)

目录 字典树的概念 字典树的逻辑 字典树的实现 字典树小结 例题强化 字典树的概念 字典树&#xff08;Trie&#xff09;是一种空间换时间的数据结构&#xff0c;是一棵关于“字典”的树&#xff0c;主要用于统计、排序和保存大量的字符串。字典树是通过利用字符串的公共前…

广域通信网 - 流量控制(停等协议、滑动窗口协议)

文章目录 1 概述2 流量控制协议2.1 停等协议2.2 滑动窗口协议 1 概述 #mermaid-svg-c9cNIYsOvLpoO4AV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-c9cNIYsOvLpoO4AV .error-icon{fill:#552222;}#mermaid-svg-c9c…

[MLIR] CodeGen Pipeline总结

参考资料&#xff1a; [MLIR] CodeGen Pipeline总结 - 知乎 (zhihu.com) 本文主要以 tensorflow 为例&#xff0c;介绍了其接入 MLIR 后的 CodeGen 过程&#xff0c;以及简要分析了一些现在常用的 CodeGen pipeline。本文是本人在结合博客(Codegen Dialect Overview - MLIR - L…

隐私计算,联邦学习

隐私计算&#xff08;“隐私保护计算” Privacy-Preserving Computation&#xff09; 隐私计算是一类技术方案&#xff0c;在处理和分析计算数据的过程中能保持数据不透明、不泄露、无法被计算方法以及其他非授权方获取。 数据方是指为执行隐私保护计算过程提供数据的组织或个…

泰国五一游玩儿攻略

泰国五一游玩儿攻略 2023年4月27日1. 机场2. 酒店和夜市 2023年4月28日2023年4月29日2023年4月30日2023年5月1日2023年5月2日2023年5月3日 2023年4月27日 1. 机场 1.1 海关资料准备&#xff1a; 往返机票&#xff08;去程返程都得有&#xff0c;每人单独打印自己的&#xff0…

多维时序 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多变量时间序列预测

多维时序 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多变量时间序列预测 目录 多维时序 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多变量时间序列预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于贝叶斯(bayes)优化卷积神经网络-门控循环…