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

【python零基础入门学习】python进阶篇之OOP - 面向对象的程序设计

 本站以分享各种运维经验和运维所需要的技能为主

《python零基础入门》:python零基础入门学习

《python运维脚本》: python运维脚本实践

《shell》:shell学习

《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

《k8》暂未更新

《docker学习》暂未更新

《ceph学习》ceph日常问题解决分享

《日志收集》ELK+各种中间件

《运维日常》运维日常

《linux》运维面试100问

OOP - 面向对象的程序设计(Object Oriented Programming)

  • 面向对象的编程

  • 在python中,一切皆对象,对象由属性和行为构成

  • 类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

  • 实例化:创建一个类的实例,类的具体对象。

  • 方法:类中定义的函数。

  • 对象:通过类定义的数据结构实例。对象包括两个数

  • 据成员(类变量和实例变量)和方法。 

class Role:def __init__(self,nm,wp):#self是约定俗成, 定义角色用'一般用于绑定属性到对象,不是必须的,self不是关键字,用任何名均可'#绑定在实例身上的属性,可以在class中的任何位置使用self.name = nmself.weapon = wpdef show_me(self):print('我是%s,我使用%s' % (self.name,self.weapon))def speak(self,words):#没有绑在实例身上的变量words就是函数的局部变量print(words)if __name__ == '__main__':#实例将会自动作为第一个参数传给方法lb = Role('吕布','方天画戟') #自动调用__init__方法print(lb.name)print(lb.weapon)lb.show_me()lb.speak('马中赤兔,人中吕布!')

组合和派生:

  

  

class Weapon:def __init__(self,nm,strength):self.name = nmself.strength = strengthclass Role:def __init__(self,nm,wp):#self是约定俗成, 定义角色用self.name = nmself.weapon = wpif __name__ == '__main__':wp = Weapon('方天画戟',100)lb = Role('吕布',wp)print(wp.name,wp.strength)print(lb.weapon.name)print(lb.weapon.strength)

子类:

  • - 两个类有很多一样的地方

  • - 某一个类与另一个类又有不同

  • - 子类可以继承父类的方法

  • - 子类可以有多个父类

  •   - 父子类有同名方法,查找顺序是自下向上,自左向右,先找到的执行

  

class Role:def __init__(self,nm,wp):#self是约定俗成, 定义角色用self.name = nmself.weapon = wpdef show_me(self):print('我是%s,我使用%s' % (self.name,self.weapon))def speak(self,words):print(words)class Warrior(Role): #括号中是父类,也叫基类passclass Mage(Role):def fly(self):print('i can fly.')if __name__ == '__main__':#实例化时,子类中没有__init__方法,将会寻找父类的相关方法lb = Warrior('吕布','方天画戟')km = Mage('孔明','扇子')lb.show_me()km.show_me()km.fly()#lb.fly()这个没有fly功能class A:def func1(self):print('a func')def func4(self):print('#####4#####')class B:def func2(self):print('b func')def func4(self):print('*********')class C(B,A):def func3(self):print('c func')# def func4(self):#     print('^^^^^^^^')if __name__ == '__main__':c1 = C()c1.func1()c1.func2()c1.func3()c1.func4()自下向上,自左向右------先C-B-A,  之后C(B,A) 

魔法方法:

特殊方法:

  • __init__ :实例化类实例时默认会调用的方法

  • __str__:打印/显示实例时调用方法以及 返回字符串

  • __call__: 用于创建可调用的实例

class Book:def __init__(self,title,author):self.title = titleself.author = authordef __str__(self):# 打印实例时,执行此方法return '《%s》' % self.titledef __call__(self):print('《%s》是%s编著的' % (self.title,self.author))if __name__ == '__main__':pybook = Book('Python核心编程','韦斯利')#调用 __init__print(pybook) #调用__str__pybook() #调用__call__

正则表达式:

匹配单个字符:

  

/t.m
/t[a-z]m
/t[0-10]m  含有0和1
/t[0-9amo]m
/t[-a1]m  减号放两边
/t[^0-9]m  取反 不要数字0-9  
/t[0-9^]m  0-9以及^号
/t\dm 相当于 [0-9]\w 任意数字字母
\W 取反  不是数字字母
\s 匹配空白字符  相当于  \r\v\f\t\n
\S 取反 不是空白字符在vim里面  一排~!@#$%^&*()_+  都要转义

匹配一组字符:

  

{M, } 最少M次

{ ,M} 最多M次

其他特殊字符:

  

<tom> 只匹配tom  或者\btom\b

例子:

为mac地址加:
  • 找到MAC地址

  • 每两个数字分一组

  • 中间以:分隔开

192.168.1.1 0000ca001256

:%s/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)$/\1:\2:\3:\4:\5:\6/     ----%s//  全文替换 在vim中

re模块:

>>> import re
#在food的开头匹配f... 匹配到返回匹配对象,匹配不到则返回None
>>> re.match('f..','food')
<_sre.SRE_Match object; span=(0, 3), match='foo'>
>>> re.match('f..','seafood')
>>> print(re.match('f..','seafood'))
None#search在字符串中匹配正则,匹配到返回匹配对象
>>> re.search('f..','seafood')
<_sre.SRE_Match object; span=(3, 6), match='foo'>
>>> m = re.search('f..','seafood')
>>> m.group()
'foo'  #匹配对象的group方法返回匹配到的内容>>> re.search('f..','seafood is food')
#返回所有匹配 findall
>>> re.findall('f..','seafood is food')
['foo', 'foo']#返回匹配对象构成的生成器
>>> re.finditer('f..','seafood is food')
<callable_iterator object at 0x7f8a055fd2b0>
>>> list(re.finditer('f..','seafood is food'))
[<_sre.SRE_Match object; span=(3, 6), match='foo'>, <_sre.SRE_Match object; span=(11, 14), match='foo'>]
>>> for m in re.finditer('f..','seafood is food'):
...     m.group()
... 
'foo'
'foo'切分:  
#以-或者. 作为分隔符切割字符串
>>> re.split('-|\.','hello-world-china.com.cn')
['hello', 'world', 'china', 'com', 'cn']#把X替换成tedu
>>> re.sub('X','tedu','X web site is X.cn')
'tedu web site is tedu.cn'# 为了提升匹配效率,最好将正则表达式先编译
>>> patt = re.compile('f..')
>>> patt.match('food')
<_sre.SRE_Match object; span=(0, 3), match='foo'>
>>> patt.search('seafood')
<_sre.SRE_Match object; span=(3, 6), match='foo'>
>>> m = patt.search('seafood')
>>> m.group()
'foo'
 例子:
分析apache访问日志:

  

import redef count_patt(fname,patt):cpatt = re.compile(patt) #为了更好的执行效率,把模式编译patt_dict = {} #把结果保存到字典with open(fname) as fobj:for line in fobj:m = cpatt.search(line) #在一行中匹配模式if m:      #如果m不是None,非空为真key = m.group()patt_dict[key] = patt_dict.get(key,0) + 1# if key not in patt_dict:#     patt_dict[key] = 1# else:#     patt_dictp[key] += 1return patt_dictif __name__ == '__main__':fname = 'access_log'ip = '^(\d+\.){3}\d+'br = 'Chrome|MSIE|Firefox'result1 = count_patt(fname, ip)result2 = count_patt(fname, br)print(result1)print(result2)#####################class
import reclass CountPatt:def count_patt(self, fname,patt):cpatt = re.compile(patt) #为了更好的执行效率,把模式编译patt_dict = {} #把结果保存到字典with open(fname) as fobj:for line in fobj:m = cpatt.search(line) #在一行中匹配模式if m:      #如果m不是None,非空为真key = m.group()patt_dict[key] = patt_dict.get(key,0) + 1# if key not in patt_dict:#     patt_dict[key] = 1# else:#     patt_dictp[key] += 1return patt_dictif __name__ == '__main__':fname = 'access_log'ip = '^(\d+\.){3}\d+'br = 'Chrome|MSIE|Firefox'wl = 'Windows|Linux'cp = CountPatt()result = cp.count_patt(fname,ip)result2 = cp.count_patt(fname, br)print(result)print(result2)# result1 = count_patt(fname, ip)# result2 = count_patt(fname, br)# print(result1)# print(result2)##################class + 绑定文件
import reclass CountPatt:def __init__(self,fname):self.fname = fnamedef count_patt(self, patt):cpatt = re.compile(patt) #为了更好的执行效率,把模式编译patt_dict = {} #把结果保存到字典with open(self.fname) as fobj:for line in fobj:m = cpatt.search(line) #在一行中匹配模式if m:      #如果m不是None,非空为真key = m.group()patt_dict[key] = patt_dict.get(key,0) + 1# if key not in patt_dict:#     patt_dict[key] = 1# else:#     patt_dictp[key] += 1return patt_dictif __name__ == '__main__':fname = 'access_log'ip = '^(\d+\.){3}\d+'br = 'Chrome|MSIE|Firefox'wl = 'Windows|Linux'cp = CountPatt(fname)result = cp.count_patt(ip)result2 = cp.count_patt(br)result3 = cp.count_patt(wl)print(result)print(result2)print(result3)
复杂列表的排序:
  • 排表的sort方法接受一个名为key的参数

  • key可以是一个函数,该函数处理列表中的每一项,将处理结果作为排序依据

>>> adict = {'172.40.58.150': 10, '172.40.58.124': 6, '172.40.58.101': 10, '127.0.0.1': 121, '192.168.4.254': 103, '192.168.2.254': 110, '201.1.1.254': 173, '201.1.2.254': 119, '172.40.0.54': 391, '172.40.50.116': 244}
方法1:
>>> sorted(adict,key=adict.get)方法2:
alist = list(adict.items())>>> def func1(seq):
...     return seq[-1]
... 
>>> alist.sort(key=func1)
>>> alist
[('172.40.58.124', 6), ('172.40.58.150', 10), ('172.40.58.101', 10), ('192.168.4.254', 103), ('192.168.2.254', 110), ('201.1.2.254', 119), ('127.0.0.1', 121), ('201.1.1.254', 173), ('172.40.50.116', 244), ('172.40.0.54', 391)]#改为匿名函数,实现降序排列
alist.sort(key=lambda seq: seq[-1],reverse=True )
alist

相关文章:

【python零基础入门学习】python进阶篇之OOP - 面向对象的程序设计

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

中国xx集团信息技术工程师面试

进入面试间&#xff0c;坐着三位面试官&#xff0c;压力扑面而来&#xff0c;三位面试官先做了自我介绍&#xff0c;介绍了一下面试的流程后才开始面试。 一、自我介绍 不多说。 二、看你学过数据挖掘这门课&#xff0c;能简单介绍一下有哪些章节&#xff0c;学了些什么&…...

Jmeter接口自动化测试 —— Jmeter下载安装及入门

jmeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 下载 下载地址&#xff1a;Apache JMeter - Download Apache JMeter 安装 由于Jmeter是基于Java的…...

ARM 学习笔记2 初识Cortex-M33与STM32G4

入门 ARM Cortex-M系列处理器的差异与联系&#xff1a;【ARM Cortex-M 系列 1 – Cortex-M0, M3, M4, M7, M33 差异】两本书籍的英文版和中文版 Definitive Guide to Arm Cortex-M23 and Cortex-M33 Processors Arm Cortex-M23和Cortex-M33微处理器权威指南ST的介绍页 Arm Cor…...

vue中使用coordtransform 互相转换坐标系

官方网站&#xff1a;https://www.npmjs.com/package/coordtransform 在使用高德sdk时&#xff0c;其返回的坐标在地图上显示时有几百米的偏移&#xff0c;这是由于高德用的是 火星坐标&#xff08;GCJ02&#xff09;&#xff0c;而不是wgs84坐标。为了消除偏移&#xff0c;将G…...

双线性插值详解

双线性插值的原理网上资料非常多,本文重点介绍双线性插值实现的两种方式: 角对齐(coner_align = True) 和 边对齐(coner_align = False)。两种不能的方式下去实现双线性插值,目标图像中的每个像素点,它是如何计算取值的,本文会通过原理结合代码的方式将实现细节讲清楚。 1…...

C++ “”

&加上有时候会加速 如果想该对象跟着函数变化一定要加“&” 在题目函数里面定义的 例如 vector<vector<bool>> visited(grid.size(),vector<bool>(grid[0].size(),false)); 如果自己定义的新void dfs&#xff08;vector<vector<bool>>…...

计算机三级有必要考吗?计算机三级有哪些科目?

在大学期间&#xff0c;计算机等级考试是一门很火热的考试&#xff0c;很多小伙伴通过二级考试以后在究竟是报考三级还是四级之间徘徊&#xff0c;下面肉丸子就来给大家分析一下&#xff0c;究竟有没有必要考计算机三级考试&#xff0c;以及计算机三级考试的科目有哪些&#xf…...

6.5 Elasticsearch(五)Spring Data Elasticsearch - 增删改查API

文章目录 1.Spring Data Elasticsearch2.案例准备2.1 在 Elasticsearch 中创建 students 索引2.2 案例测试说明 3.创建项目3.1 新建工程3.2 新建 springboot module&#xff0c;添加 spring data elasticsearch 依赖3.3 pom.xml 文件3.4 application.yml 配置 4.Student 实体类…...

XPS—专项文献阅读-科学指南针

XPS&#xff08;X-ray Photoelectron Spectroscopy&#xff09;&#xff0c;X射线光电子能谱&#xff0c;可以说是材料研究中必不可少的一类分析测试手段了。今天我们就来讲讲&#xff0c;什么情况下我们需要用到XPS&#xff0c;以及拿到数据之后应该怎样进行数据处理分析。 XP…...

电脑办公助手之桌面便签,助力高效率办公

在现代办公的快节奏中&#xff0c;大家有应接不暇的工作&#xff0c;每天面对着复杂的工作任务&#xff0c;总感觉时间不够用&#xff0c;而且工作无厘头。对于这种状态&#xff0c;大家可以选择在电脑上安装一款好用的办公便签软件来辅助日常办公。 敬业签是一款专为办公人士…...

【面试题】2023虹软计算机视觉一面

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 1.自我介绍 2.介绍了自己的项目&#xff0c;并提问项目&#xff0c;讲了30分钟 3.介绍centernet&#xff0c;它和其他目标检测模型有什么区别 4.介绍yolov5 5.介绍focal loss 6.双线性插值和最近邻插值的区…...

板带纠偏控制系统伺服比例阀放大器

板带纠偏控制系统是集光、机、电、液四方面有机结合在一起的全闭环电液伺服系统&#xff0c;是用途广泛的机电一体化高新技术产品。 板带纠偏控制系统可广泛地应用于机械、冶金、造纸、橡胶、织带、纺织印染、电镀、塑膜胶片等诸多行业的不同种类的带材生产线的在线纠偏。 板…...

视频I420裸流保存为文件

1、从TvCamera的ABK回调的OnImageReceived出来的是I420的数据&#xff0c;保存文件的方式如下&#xff1a; void OnImageReceived(const uint8_t* data, size_t size, uint16_t widht, uint16_t height) { .............. FILE *fp fopen("test.yuv", "wb&quo…...

IDEA中SpringBoot项目的yml多环境配置

SpringBoot的yml多环境配置 创建多个配置文件 application.yml #主配置文件 application-dev.yml #开发环境的配置 application-test.yml #测试环境的配置在application.yml中添加多环境配置属性 spring:profiles:active: profiles.active项目启动可能不会识别&#x…...

【Linux】UDP协议

文章目录 &#x1f4d6; 前言1. 再谈端口号1.1 端口号划分范围&#xff1a;1.2 端口和进程的关系&#xff1a;1.2 - 1 netstat1.2 - 2 pidof 1.3 源端口和目的端口&#xff1a; 2. UDP协议2.1 UDP协议格式&#xff1a; 3. 再谈write/read4. UDP需要接收/发送缓冲区吗5. UDP使用…...

AutoCAD 2022 for Mac/Windows升级您的设计工具,提升工作效率

Autodesk AutoCAD 2022 是设计行业最流行的计算机辅助设计 (CAD) 软件之一。这款软件由Autodesk公司开发&#xff0c;它提供了强大的功能&#xff0c;从基本的设计和修改工具&#xff0c;到复杂的3D建模和渲染&#xff0c;一切尽在掌握。通过其直观的用户界面和不断更新的功能&…...

协程,GIL全局解释器,互斥锁,线程池,Concurrent模块

进程是资源分配的最小单位&#xff0c;线程是CPU调度的最小单位。每一个进程中至少有一个线程。 Python对并发编程的支持 (1)多线程&#xff1a;threading&#xff0c;利用CPU和IO可以同时执行的原理&#xff0c;让CPU不会干巴巴等待IO完成。 (2)多进程&#xff1a;multiproces…...

MAPEFFECT代码在传奇中有何作用如何运用

今天介绍一下MAPEFFECT的作用和使用方法&#xff0c;可以实现的效果比如进入游戏或者某个地图显示特效&#xff0c;或者显示地图名称&#xff0c;提示信息等等用到的命令就是MAPEFFECT。 使用方法是 在QManage.txt中找到 [Startup] 在下面增加如下代码 #if #act MAPEFFECT 11…...

Godot 官方2D C#重构(1):雪花碰撞

前言 Godot 官方 教程 Godot 2d 官方案例C#重构 专栏 Godot 2d 重构 github地址 实现效果 难点介绍 Godot GDScript和C# 对应关系大部分靠猜 文件导入 资源地址&#xff1a;默认为res://开头2D贴图导入类型&#xff1a;Texture2D public Texture2D Bullet_Image new Textu…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...