当前位置: 首页 > 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;我将…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...