python面向对象(上)

news/2024/5/20 8:05:25/文章来源:https://blog.csdn.net/qq_54783066/article/details/127988427

python面向对象上

  • 命名规则
  • 对象的创建
    • 创建类对象
    • 创建实例对象
    • 修改增加类属性
  • 构造方法
    • 构造实例方法
      • 不带变量
      • 带变量
      • 构造方法小例子
    • 构造类方法
    • 构造静态方法
  • 运算符的重载
    • 比较运算符重载
    • 字符串重载
    • 索引或切片重载
    • 索引或切片重载
    • 检查成员重载
    • 重载小结
  • 持续更新中~~~~~~~~

先上个例子:

class Student: # 类名,同时创建同名的类对象和变量,类对象只能有一个school='yyds' #类属性def show(self,id,name,age,school): # 第一个参数必须是self,指的是当前类的实例self.id=id# name,id,age是实例属性self.name=nameself.age=ageself.school=schoolprint(self.id,self.name,self.age)# 创建一个实例

命名规则

创建类的时候命名有以下几个规则:
1:用class关键字来定义类,命名格式如上
2:类名的首字母应大写,如上的Student(不是强制的,但是是一般的命名规则,这样命名不会出错)
3:方法命名的时候如果有多个单词第一个单词首字母不用大写,其余的单词首字母大写
4:我们再给属性或方法命名的时候通过下划线来表示变量的类别:_foo(左边有一个下划线),表示只允许本身及其子类应用;__foo(左边有两个下划线,表示是私有类型),只允许这个类本身访问; __ foo __(左右各有两个下划线,表示python的内置函数)
一个类主要由以下六个要素组成:
类对象、实例对象、类属性、实例属性、类方法、实例方法。

对象的创建

创建类对象

以上已经说明,用(class+类名)创建,创建类名的同时还自动创建类对象和量,名称就是类名称,这里要注意的是类对象只能有一个。

创建实例对象

实例对象通过调用类对象来创建,如下所示:

s1=Student() #创建一个实例对象,继承其所有的实例方法

通过以上的代码,我们创建了一个实例对象,这里实例对象会继承所有的实例方法,实例属性等
如果类中有相同的类属性和实例属性,那么通过实例对象只能访问实例属性,如下所示的代码:

class Student:school='yyds'def say(self,school):self.school=school
s1=Student()
s1.say('ohhh')
print(s1.school,Student.school)

以上的话我们运行可以发现,用s1得到的是ohhh,用Student得到是yyds,这里我们可以理解为局部变量的优先级大于全局变量,两者尽量不要有重名

修改增加类属性

此外,我们还可以修改或增加类对象与实例对象的属性,如下所示的代码:

class Student:school='yyds'def say(self,school):self.school=school
s1=Student()
s1.say('ohhh')
s1.age=11
s1.name='小明'
Student.age=111
print(s1.age,s1.name,Student.age)

我们在这里对s1增加了age与name属性,对Student增加了age属性,输出的与增加的相同

构造方法

构造实例方法

要注意的一点是实例方法的第一个变量永远是self,其后面跟着定义的是其余的自定义的变量。
我们这里先说一种特殊的方法定义:对于__init__ 的重写,python在创建对象的时候默认是存在init的,但是如果我们想对初始化重新写的话,就可以加入一个对于以上__init__的重写,也可以带变量,但是在调用创建的时候也要带变量。
如下图代码所示:

不带变量

class Student:school='yyds'def __init__(self):self.name='111'self.age=16self.school='ohhh'
s1=Student()
print(s1.name,s1.age,s1.school)

这个是不带变量的,下面是输出:
在这里插入图片描述

带变量

class Student1:school='yyds'def __init__(self,name,age,school):self.name=nameself.age=ageself.school=school
s2=Student1('yyds',16,'ohhh')
print(s2.school,s2.name,s2.age)

这是带变量的,下面是输出结果
在这里插入图片描述
当然也可以构造很多其他的方法,构造的形式和以上类似,但要注意的一点是第一个变量永远是 self
我们再来一个实例方法的例子

构造方法小例子

class Student:student_num=0def add(self,name):print('增加了一名新同学,名字叫:%s'% name)Student.student_num+=1
s1=Student()
s1.add('yyds')
print(s1.student_num)
s2=Student()
s2.add('ohhh')
print(s2.student_num)

我们可以看出来在一个代码中,每创建一个类属性,类变量不会清零,而是递加的

构造类方法

很简单,就是在方法的上面加上一个@classmethod,但是第一个变量是cls,类变量可以调用,通过cls可以访问相关的类属性,但是不能访问实例属性,如下面的代码所示:

class Student:student_num=0def add(self,name):print('增加了一名新同学,名字叫:%s'% name)Student.student_num+=1@classmethoddef sub(cls,name):# 这里的cls只能访问类属性,不能访问实例属性print('转走了一个学生,名字为:%s'% name)cls.student_num-=1
s1=Student()
s1.add('yyds')
print(s1.student_num)
s2=Student()
s2.add('ohhh')
print(s2.student_num)
Student.sub('ohhh')
print(Student.student_num)

构造静态方法

在程序的前面加一个@staticmethod
静态方法可以访问类属性,但不可以访问实例属性

class Student():num=0def __init__(self,myName):Student.num+=1self.name=myName@staticmethoddef count():print('学生个数:%d'%Student.num)
Student.count()
s1=Student('小千')
s1.count()
s2=Student('小峰')
s1.count()

下面是输出结果:
在这里插入图片描述

运算符的重载

比较运算符重载

class MyComplex:def __init__(self,r=0,i=0): # 构造方法self.r=rself.i=idef __add__(self, other): # 重载乘运算return MyComplex(self.r+other.r,self.i+other.i)def __sub__(self, other): # 重载减运算return MyComplex(self.r-other.r,self.i-other.i)def __mul__(self, other): # 重载乘运算return MyComplex(self.r*self.r,other.i*other.i)def __truediv__(self, other): # 重载除运算return MyComplex((self.r*other.r+self.i*other.i)/(other.r**2+other.i**2),(self.i*other.r-self.r*other.i)/(other.r**2+other.i**2))def show(self): # 设置输出的格式if self.i<0:print('(',self.r,self.i,'j',')',sep='')else:print('(',self.r,'+',self.i,'j',')',sep='')
c1=MyComplex(6,-8)
c2=MyComplex(1,-1)
(c1+c2).show()
(c1-c2).show()
(c1*c2).show()
(c1/c2).show()

下面是输出:
在这里插入图片描述

字符串重载

当对象作为str()或者print()的参数时,该对象会调用重载的__str__ 方法,所以我们在类中重载了str之后,该类加减的时候会直接返回我们定义的输出形式

class MyComplex:def __init__(self,r=0,i=0):# 构造方法self.r=rself.i=idef __str__(self):if self.i<0:return '('+str(self.r)+str(self.i)+'j)'else :return '('+str(self.r)+'+'+str(self.i)+'j)'
c1=MyComplex(6,-8)
c2=MyComplex(1,2)
print(c1,str(c2))

索引或切片重载

当对实例对象执行索引、分片或迭代时,该对象会调用__getitem__()方法

class Data:# 定义一个数据类def __init__(self,list):self.data=list[::-1]def __getitem__(self, item): # 重载索引与分片return self.data[item]
data=Data([1,2,3,4,5])
print(data[2])
print(data[1:])
for i in data:print(i,end=' ')

索引或切片重载

用setitem来是实现对对象的修改

class Data:# 定义一个数据类def __init__(self,list):self.data=list[::-1]def __setitem__(self, key,value): # 重载索引与分片self.data[key]=value
data=Data([1,2,3,4,5])
print(data.data)
data.data[1]='千千万万'
data.data[2:]='you are a little cow horse'
print(data.data)

检查成员重载

class Data:# 定义一个数据类def __init__(self,list):self.data=list[::-1]def __contains__(self, item): # 重载索引与分片return item in self.data
data=Data([1,2,3,4,5])
print(1 in data.data)

重载小结

总结一下:重载就是先创建一个类,然后我们在里面定义重载的符号,我们在要建一个实例对象来表达我们要计算的数,然后实例对象之间的计算就是来根据重载符来计算的

持续更新中~~~~~~~~

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

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

相关文章

古人的名与字、号、讳、谥有什么区别

古人复杂的名字 这个世界上想来是不存在没有名字的人&#xff0c;即便真的有人没名字&#xff0c;也会被外人赠予姓名&#xff0c;比如说一些古人典籍里的“无名氏”&#xff0c;就是专门用来形容那些没有名字也不清楚根脚的人&#xff0c;即便是现如今一些作品不知道作者是谁…

国外服务器采取数据备份和灾难恢复的重要性

在国外服务器的使用中&#xff0c;数据的安全性和完整性是任何组织都不能忽视的问题。丢失数据可能会对业务造成毁灭性的影响&#xff0c;因此必须有一个完善的数据备份和灾难恢复计划。 什么是备份? 备份将数据复制到辅助形式&#xff0c;如存档文件&#xff0c;在灾难发生时…

C++:函数指针进阶:看完还不用std::function来捶我

1&#xff1a;函数指针的背景 我们先简单聊一下函数指针的背景&#xff0c;具体使用请参考我的这篇博客 C &#xff1a;函数&#xff1a; 函数指针_hongwen_yul的博客-CSDN博客 假设现在有这样一段代码&#xff1a;C/C中可以使用指针指向一段代码&#xff0c;这个指针就叫函…

【外卖项目实战开发一】

文章目录1、软件开发整体介绍2、外卖项目介绍3、环境搭建数据库环境搭建创建数据库执行SQL脚本数据表maven项目搭建添加依赖:application.yml配置application启动类4、后台登录功能开发需求分析代码开发5、后台退出功能开发1、软件开发整体介绍 软件开发流程 角色分工 软件…

Quasar搭建教程初体验

文章目录一、Quasar框架介绍二、搭建一个简单的Quasar程序1、Quasar CLI安装2、创建Quasar应用程序3、运行Quasar三、使用Quasar开发SSR四、使用Quasar开发桌面应用(Electron)1、添加Quasar Electron模式2、运行开发五、使用Quasar移动应用(Capacitor)1、下载安装AndroidStudio…

Scrapy基本概念——Item Pipeline

一、Item Pipeline介绍 蜘蛛抓取的每一个Item都会被发送到Item Pipeline。根据ITEM_PIPELINES的优先级设置&#xff0c;不同的Item Pipeline依次处理每一个Item&#xff0c;最后可删除该Item不做处理&#xff0c;也可将该Item发送到下一个Item Pipeline。Item Pipeline的主要用…

【Shell 脚本速成】05、Shell 运算详解

目录 一、赋值运算 二、算术运算[四则运算] 2.1 运算符与命令 2.2 整形运算 expr 命令&#xff1a;只能做整数运算&#xff0c;格式比较古板&#xff0c;运算符号两边注意空格 let命令&#xff1a;只能做整数运算&#xff0c;且运算元素必须是变量&#xff0c;无法直接对…

11.14-11.21

1.线性蒙皮 1.1 线性蒙皮定义 线性蒙皮&#xff1a;是由一系列骨骼驱动的。每个顶点会根据顶点权重图和相应的骨骼关联。根据骨骼在当前位置相对于静止位置的变换矩阵以及此顶点相对于该骨骼的权重&#xff0c;我们可以计算出该顶点在该骨骼影响下的位置。 假设Wij是第j个骨…

OpenGL原理与实践——核心模式(五):颜色、基础光照、Phong模型、材质与光

目录 颜色相关理论 什么是颜色 如何计算颜色&#xff1f; 简单实现 Phong光照模型——局部光照模型 环境光 ​编辑 漫反射 镜面反射 材质与光 材质与纹理的关系 材质在shader的体现 材质属性与光属性 光在shader的体现 整体源码实现及渲染结果 关键代码 shade…

【Kubernetes | Pod 系列】Pod的 YAML 清单文件详解

目录3. Pod的 YAML 清单文件3.1 获取资源对象 YAML3.2 解析 YAML 清单文件&#xff08;1&#xff09;apiVersion查看 Kubernetes API 中全部的 API 组&#xff08;2&#xff09;kind查看 Kubernetes 中全部的对象资源类型&#xff08;3&#xff09;metadata&#xff08;4&#…

cron表达式,结构、字段说明、特殊字符说明、常用表达式

1.cron表达式的结构 Cron表达式是一个字符串&#xff0c;结构非常简单。Cron表达式从左到右分为6或7个字段&#xff0c;每个字段代表一个含义&#xff0c;用空格隔开。如下图所示&#xff1a; 2.cron表达式中各个字段的说明和规则 Cron一共有7位&#xff0c;最后一位是年份&…

C语言既然可以自动为变量分配内存,为什么还要用动态分配内存呢?

一、前言 不知道大家在学习C语言动态分配内存的时候有没有过这样的疑问&#xff0c;既然系统可以自动帮我们分配内存&#xff0c;为什么还需要我们程序员自己去分配内存呢&#xff1f; 如果想要弄清楚这些问题&#xff0c;我们首先就要了解静态内存和动态内存有什么区别&…

Pycharm开发环境下创建python运行的虚拟环境(自动执行安装依赖包)

问题&#xff1a;基于Django开发的后台程序涉及到很多依赖的开发包&#xff0c;将该项目迁移到其它电脑环境下运行需要搭建环境&#xff0c;由于项目中有requirement.txt&#xff0c;该文件内包含了运行该项目所需的依赖&#xff1b;最简便的方式是执行命令自动安装requirement…

【App自动化测试】(九)移动端复杂测试环境模拟——来电、短信、网络切换

目录1. 发送短信2. GSM电话3. 设置模拟信号强弱4. 设置网速5. 设置网络连接类型前言&#xff1a; 本文为在霍格沃兹测试开发学社中学习到的一些技术写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ &#x1f618; 当我们使用模拟器来…

CUDA——向量化内存

许多 CUDA 内核受带宽限制&#xff0c;新硬件中触发器与带宽的比率增加导致更多带宽受限内核。 这使得采取措施缓解代码中的带宽瓶颈变得非常重要。 在本文中&#xff0c;我将向您展示如何在 CUDA C/C 中使用矢量加载和存储来帮助提高带宽利用率&#xff0c;同时减少执行指令的…

kafka消息的序列化与反序列化

一、前言 在使用kafka发送消息时&#xff0c;producer端需要序列化&#xff0c;在大多数场景中&#xff0c; 需要传输的是与业务规则相关的复杂类型&#xff0c; 这就需要自定义数据结构。 Avro是一种序列化框架&#xff0c; 使用JSON来定义schema&#xff0c; sh cema由原始类…

PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八]

PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八] 原项目链接&#xff1a;fork一下即可&#xff1a;https://aistudio.baidu.com/aistudio/projectdetail/5096910?contributionType1 相关项目参考&#xff1a;&#xff08;其余图神经网络相关项目见主页&#xff09; …

留学生怎么正确应对Paper写作?

留学生很多都是对Paper比较抗拒的&#xff0c;因为Paper写作的频率是很高的&#xff0c;平时的课程也是比较紧凑的。相信对于初到英国留学的小伙伴们而言Paper将很长时间都是大家的痛。多少留学生被Paper折磨&#xff0c;其实英文Paper写不好的原因在于&#xff0c;对于中国留学…

单目标应用:最有价值球员算法(Most Valuable Player Algorithm,MVPA)求解旅行商问题TSP

一、最有价值球员算法 最有价值球员算法&#xff08;Most Valuable Player Algorithm&#xff0c;MVPA&#xff09;由Bouchekara 等人于2017年提出&#xff0c;该算法受到体育比赛的启发&#xff0c;球员们为了赢得冠军而组成队伍进行队伍竞争&#xff0c;他们也为了赢得最有价…

美食杰项目(二)首页

目录前言具体样式代码思路加载样式相应组件相应代码总结&#xff1a;前言 本节给大家讲的是美食杰项目的首页的主要功能和具体样式 具体样式 代码思路 1.点击首页跳转到首页页面 2.在父组件将轮播图所需的图片请求出来&#xff0c;再传给轮播组件 3.在父组件将商品列表的数据…