当前位置: 首页 > news >正文

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&#xff0…...

太阳系三体模拟器

介绍 《三体》是刘慈欣创作的长篇科幻小说,文中提到的三体问题比较复杂和无解。 该项目代码就是利用 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&#xff1a; 会出现图片无法显示的问题&#xff0c;可以用以下方法来过滤处理 <rich-text :nodes"question.title | formatRichHtml"></rich-text> formatRichHtml(html) {if (!html) {return html;}//控制小程序…...

flink内存配置

flink内存配置 配置 TaskManager 内存 | Apache Flink...

easyexcel 导出

在使用EasyExcel库进行数据写入时&#xff0c;通常我们会使用实体类来存储数据。但是当遇到动态查询&#xff0c;无法确定属性数量和名称时&#xff0c;就需要使用Map来接收数据。然而&#xff0c;直接将Map中的数据写入Excel表格并不是一件简单的事情。接下来&#xff0c;我将…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...