Python学习笔记(六)面向对象编程
最近准备HCIE的考试,用空余时间高强度学习python
介绍了Python中面向对象编程的基本概念,包括类、类的属性、类的方法、类的方法中实例方法、类方法、静态方法,在类与对象中动态添加属性和方法,以及继承、类变量、多态等概念
类(类对象):为了做区分而创建的一些特性的群体
子类:通过继承创建,为了在类下做更清晰的区分
对象:建立在类的基础上,在某一类或子类下的个体
实例:约等于对象,xx对象是xx类的实例化
在python中,一切都是对象;凡是对象,都是某个类的实例
使用面向对象编程,在做好细分之后,能够更快实现功能,更容易维护 类越细分,对象就越精细
类1 → 对象1,对象2
↓
子类1 → 对象1,对象2
子类2...
子类3...
面向对象有三大特征:封装、继承、多态
类、类的属性、类的方法
#创建类————使用class关键字
#class 类名() 括号代表要继承,在规范上,类名的首字母要大写
class Ws:pass
class Xhy:pass#创建对象——根据类创建一个属于这个类的对象
v1 = Ws() #v1是由Ws这个类实例化生成的对象,v1这个对象是Ws类的实例
v2 = Ws()
v3 = Ws()#类————管理员、用户
#类的属性————是类里的变量。反映该类对象的信息,例如账号、密码、名字等
#类的方法————是类里的函数。反映该类对象能做的事,例如账号权限、添加用户、修改密码等,是一种方法,比如list.append,是自己定义的函数#添加类的属性,一般都是类的可变属性
#添加一个不变的属性
class User_info: #通过__init__构造方法def __init__(self): #self代表要被实例化的对象self.username = 'ws' #为其赋值self.age = '24'self.password = 'ws111'
user1 = User_info()
print(user1.password)
#ws111
#添加类的可变属性,这样可以适用更多user
class User_info:def __init__(self,username,age,password):self.username = usernameself.age = ageself.password = passworduser1 = User_info('ws',24,'ws111')
user2 = User_info('xhy',23,'xhy111')
print(user1.username)
print(user2.password)
#ws
#xhy111#添加类的方法,在创建了对象之后,就可以直接使用类的方法
class User_info:def __init__(self,name,password,age):self.name = nameself.password = passwordself.age = agedef show(self):print(self.name, self.password)def show_age(self):print(self.age)
user1 = User_info('ws','ws111',age=24)
user1.show()
#ws ws111
user1.show_age()
#24
#在方法中定义的类的属性,可以在全局进行调用
class User_info:def __init__(self,name):self.name = namedef show_age(self):self.age = 24 ####在方法中定义类的属性print(self.age)
user1.show_age()
#24
实例方法、类方法、静态方法
#实例方法————首个参数为self的方法,绑定给该类的实例调用,类本身不能调用
class User_info:def __init__(self,name):self.name = namedef show(self):pass
user1 = User_info('ws') #在实例方法中,必须要创建一个实例,才能使用类中的方法
user1.show()
#无法用类来直接调用,像User_info.show这样的用法#类方法————首个参数为cls,并且以classmethod装饰的方法
#可以直接使用类来调用如User_info.show,但无法调用类的参数
class User_info:def __init__(self,name):self.name = name@classmethoddef show(cls):print('ws')@classmethoddef show_name(cls):print(self.name)
User_info.show()
#ws
User_info.show_name()
#报错,无法调用类的参数
#如果需要则需要额外在类方法中传入参数
class User_info:def __init__(self, name, age):self.name = nameself.age = age@classmethod #类方法的装饰器def show_name(cls, age):print(age)
User_info.show_name(24)
#24#静态方法————不需要cls或self,使用staticmethod装饰,可以直接调用,但无法使用类的属性
class User_info:def __init__(self, name):self.name = name@staticmethoddef show_name(): #需要传参则定义形参print('11111')
User_info.show_name()
#11111
面向对象的动态特性
动态添加属性、修改属性
#动态的添加对象和类的属性
# 添加到对象只会影响对象本身,而为类添加的属性会应用给所有对象
class User_info:def __init__(self, name):self.name = nameself.username = 'ws' #添加一个固定的类的属性值
if __name__ == '__main__':user1 = User_info('ws') #创建了一个实例/对象user1user1.age = 24 #age这个属性只属于user1这个对象中,而不属于User_info的类print(user1.age)#24user1.age = 25 #动态修改对象的属性值print(user1.age)# 25User_info.password = 'ws111' #为类添加属性,如果没有会添加到user1中,且值是可修改print(user1.password)#ws111User_info.password = 'xhy111' #为类添加属性,如果原本有值就会修改print(user1.password)#xhy111User_info.username= 'xhy' #无法动态修改类中原本就有的属性值,实例化后的对象继承了类的值,不会变化print(user1.username)#ws
动态添加方法
添加实例方法、添加类方法、添加静态方法
#添加实例方法————只能单独为对象添加,不能为类添加
import types #导入types模块
class User_info:pass
def show(self): #准备一个实例方法print('111')
if __name__ == '__main__':user1 = User_info() #实例化一个对象#目标实例的方法 = types.MethodType(待添加函数名,目标函数名)user1.show = types.MethodType(show,user1)user1.show()#111#添加类方法———只能为类添加
class User_info:pass
@classmethod
def show(cls):print('111')
if __name__ == '__main__':User_info.show = show #直接赋值就行,不要调用User_info.show()#111#添加静态方法————只能为类添加
class User_info:pass
@staticmethod
def show():print('111')
if __name__ == '__main__':User_info.show = showUser_info.show()#111
继承
子类继承父类之后可以直接使用父类定义好的属性和方法
#最简单的继承性质说明
class User():def __init__(self,name):self.name = namedef show(self):print('111')
#class 子类名(父类名)
class U001(User):def age(self): #可以在子类里定义新的方法,只属于这个子类可用的print('123')def show(self): #可以在子类里重写父类的方法,会盖掉父类的方法print('222')
if __name__ == '__main__':user1 = U001('ws')user1.show()#222#super函数————调用父类的 方法#继承父类方法————可以在子类的方法中调用父类的任意方法
class User:def __init__(self):self.age = 24def show(self,name):print(f'{self.age}岁,{name},是学生') #调用age
class U01(User):def __init__(self):self.age = 26def show2(self):print('222') #多加一行显示区别super().show('ws') #调用了父类中的方法show,并且原函数需要传参,所以这里也传参
if __name__ == '__main__':user1 = U01()user1.show2() #调用的类的属性26岁是本类的属性,而不是父类的属性24岁#222#26岁,ws,是学生#继承父类属性————分多种情况
1、全部保留属性,不新增
2、全部替换,只用自己的
3、保留部分属性,不新增
4、保留部分属性,有新增#全部保留属性,不新增
class User_info:def __init__(self, username, password, email):self.username = usernameself.password = passwordself.email = email
class User(User_info):pass #最简单,直接什么都不用动,不重写则全部保留if __name__ == '__main__':user1 = User('ws','ws111','1320')print(user1.username)#ws#全部替换,只用自己的
class User_info:def __init__(self, username, password, email):self.username = usernameself.password = passwordself.email = email
class User(User_info): def __init__(self,age,job): #重写构造函数self.age = ageself.job = jobif __name__ == '__main__':user1 = User('ws','ws111')print(user1.age)#wsprint(user1.username)# 报错#保留部分属性,不新增
class User_info:def __init__(self, username, password, email):self.username = usernameself.password = passwordself.email = email
class User(User_info):def __init__(self,username,password):# 使用super,重跑一遍父类构造函数的形参,并且只赋值自己要的,不要的空着super().__init__(username=username,password=password,email=None)#这样就只传了name和password两个属性
if __name__ == '__main__':user1 = User('ws','ws111')print(user1.username)#ws#保留部分属性,有新增
class User_info:def __init__(self, username, password, email):self.username = usernameself.password = passwordself.email = email
class User(User_info):def __init__(self,username,password,job):self.job = job #新增一个job属性super().__init__(username=username,password=password,email=None)
if __name__ == '__main__':user1 = User('ws','ws111','student')print(user1.username,user1.job)#ws student
类变量
在类中设置的变量,但不是类的属性
先介绍python中使用的查找算法
#Python的查找算法(包括变量的查找、类变量的查找、super函数调用)
#原则是自下而上,从里到外#变量的查找
def fun():v1 = 0def fun1():v1 = 1 #先找最里层,即fun1中的v1print(v1)
if __name__ == '__main__':v1 = 2fun()#1
#super函数的调用
class fun:def show(self):pass
class fun1(fun):pass
class fun2(fun1)def show2(self):super().show() #这条super的对函数的调用首先会在fun1中寻找,然后去fun中寻找
if __name__ == '__main__':pass#mro查找算法——应对多继承的情况下的查找
#应用于一个类继承了多个类的情况
#mro采用的算制为C3,融合了DFS(深度查询)和BFS(广度查询)
class fun():pass
class fun1():pass
class fun2(fun,fun1):pass
if __name__ == '__main__':v1 = fun2()print(v1.var) #DFS按顺序,首先查找fun以及fun的父类,再查询fun1以及fun1的父类#类变量
#类变量可以使用类来访问和修改
class User_info():v1 = 0def __init__(self,name):self.name = name
if __name__ == '__main__':user1 = User_info('ws')User_info.v1 = 1 #只使用类来访问和修改print(User_info.v1)#1#如果user1中没有v1的变量,则去user1的父类User_info中找v1print(user1.v1)#1user1.v1 = 2 #为对象动态添加了一个属性print(user1.v1) #优先使用user1的v1#2print(User_info.v1)#1
多态
用来控制对象的行为
不同的对象调用同一个方法,表现出不同的状态
#多态需要有继承,只发生在父类和子类之间,需要有重写
#仅需一个函数,传递不同的对象,就能使用不同子类中的制定函数
#可扩展性和可维护性都增加了
class Version:def what(self):print('Version')
class V1(Version):def what(self):print('v1')
class V2(Version):def what(self):print('v2')
class V3(Version):def what(self):print('v3')
def fun(object):object.what()
if __name__ == '__main__':v1 = V1()v2 = V2()v3 = V3()fun(v1)fun(v2)fun(v3)
#v1
#v2
#v3
相关文章:
Python学习笔记(六)面向对象编程
最近准备HCIE的考试,用空余时间高强度学习python 介绍了Python中面向对象编程的基本概念,包括类、类的属性、类的方法、类的方法中实例方法、类方法、静态方法,在类与对象中动态添加属性和方法,以及继承、类变量、多态等概念 类…...
CCNP课程实验-05-Comprehensive_Experiment
目录 实验条件网络拓朴 基础配置实现IGP需求:1. 根据拓扑所示,配置OSPF和EIGRP2. 在R3上增加一个网段:33.33.33.0/24 (用Loopback 1模拟) 宣告进EIGRP,并在R3上将EIGRP重分布进OSPF。要求重分布进OSPF后的路由Tag值设置为666&…...
第3课 使用FFmpeg获取并播放音频流
本课对应源文件下载链接: https://download.csdn.net/download/XiBuQiuChong/88680079 FFmpeg作为一套庞大的音视频处理开源工具,其源码有太多值得研究的地方。但对于大多数初学者而言,如何快速利用相关的API写出自己想要的东西才是迫切需要…...
Java 动态树的实现思路分析
Java 动态树的实现 目录概述需求: 设计思路实现思路分析1. 简单Java实现:2.建立父子表存储3.前端的对应的json 字符串方式 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy࿰…...
太阳系三体模拟器
介绍 《三体》是刘慈欣创作的长篇科幻小说,文中提到的三体问题比较复杂和无解。 该项目代码就是利用 Python 来模拟三体的运行,此项目代码完全共享,欢迎下载。 我们可以自己通过调整天体的初始坐标、质量和矢量速度等等参数来自定义各种场景…...
SQL常见面试题
今天刷了一遍牛客里的必知必会题,一共50道题,大部分都比较基础,下面汇总一下易错题。 SQL81 顾客登录名 本题几个关键点: 登录名是其名称和所在城市的组合,因此需要使用substring()和concat()截取和拼接字段。得到登…...
怎么获取客户端真实IP?GO
在使用 Golang 的 net/rpc 包进行 RPC 服务开发时,我们有时候会遇到需要获取客户端的真实 IP 和当前连接 net.Conn 的需求。然而在 net/rpc 的服务处理方法中,并没有提供直接获取到这些信息的途径。 那么,我们应该如何去获取这些信息呢&…...
山海鲸可视化软件的优势:数据整合、可视化与个性化定制
随着科技的快速发展,企业数字化转型已成为必然趋势。而对于一些本身没有开发优势或非技术型企业,数字化产品的选择就成为重中之重。作为山海鲸可视化软件的开发者,我们深知这一点,对于企业来说,能选择一个产品一定要有…...
Mybatis行为配置之Ⅰ—缓存
专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…...
【Java开发岗面试】八股文—计算机网络
声明: 背景:本人为24届双非硕校招生,已经完整经历了一次秋招,拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验(主要是校招),包括我自己总结的八股文、算法、项目介绍、HR面和面试…...
【PythonRS】基于矢量范围批量下载遥感瓦片高清数据(天地图、高德、谷歌等)
这个是之前写的代码了,正好今天有空所以就和大家分享一下。我们在处理项目时,有时候需要高清底图作为辅助数据源去对比数据,所以可能会需要卫星数据。所以今天就和大家分享一下如何使用Python基于矢量范围批量下载高清遥感瓦片数据。 1 读取矢…...
穷举vs暴搜vs深搜vs回溯vs剪枝
欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻全排列👉&#…...
Sensor Demosaic IP 手册PG286笔记
《 UG1449 Multimedia User Guide》中包含了大量的多媒体IP简介。 本IP 用于对bayer RGB(每个pixel只有单个R/G/B)做去马赛克处理,恢复成每个pixel点都有完整的RGB值。通过axi接口配置IP内部erg。 1、算法手册中的描述 提到了几种插值算法&…...
HarmonyOS —— UIAbility 页面跳转总结
HarmonyOS —— UIAbility 页面跳转总结 Author:Gorit Date:2023年12月27日 一、系统环境 HarmonOS API9SDK 3.1.0Stage 模型 二、应用内跳转 在应用内之前实现不同 page 的跳转,我们使用 router 即可,页面跳转主要支持如下…...
Spring Boot 3 集成 Jasypt详解
随着信息安全的日益受到重视,加密敏感数据在应用程序中变得越来越重要。Jasypt(Java Simplified Encryption)作为一个简化Java应用程序中数据加密的工具,为开发者提供了一种便捷而灵活的加密解决方案。本文将深入解析Jasypt的工作…...
Spring Boot整合 EasyExcel 实现复杂 Excel 表格的导入与导出功能
文章目录 1. 简介2. 引入依赖3. 导入功能实现3.1 创建实体类3.2 编写导入 Controller3.3 编写导入页面 4. 导出功能实现4.1 编写导出 Controller4.2 编写导出页面 5. 启动应用 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 &…...
SQLSERVER排查CPU占用高
操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库实例里有多个数据库 现象 他说是这几天才出现的,而且在每天的某一个时间段才会出现CPU占用高的情况 内存占用不太高,只占用了30个G CPU…...
uniapp:富文本回显
一、使用uniapp官方的标签 rich-text: 会出现图片无法显示的问题,可以用以下方法来过滤处理 <rich-text :nodes"question.title | formatRichHtml"></rich-text> formatRichHtml(html) {if (!html) {return html;}//控制小程序…...
flink内存配置
flink内存配置 配置 TaskManager 内存 | Apache Flink...
easyexcel 导出
在使用EasyExcel库进行数据写入时,通常我们会使用实体类来存储数据。但是当遇到动态查询,无法确定属性数量和名称时,就需要使用Map来接收数据。然而,直接将Map中的数据写入Excel表格并不是一件简单的事情。接下来,我将…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
