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

news2024/11/16 1:34:04

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

《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 = nm
        self.weapon = wp


    def 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 = nm
        self.strength = strength



class Role:
    def __init__(self,nm,wp):#self是约定俗成, 定义角色用
        self.name = nm
        self.weapon = wp

if __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 = nm
        self.weapon = wp


    def show_me(self):
        print('我是%s,我使用%s' % (self.name,self.weapon))


    def speak(self,words):
        print(words)

class Warrior(Role): #括号中是父类,也叫基类
    pass

class 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 = title
        self.author = author


    def __str__(self):
        # 打印实例时,执行此方法
        return '《%s》' % self.title


    def __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 re

def 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] += 1
    return patt_dict

if __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 re

class 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] += 1
        return patt_dict

if __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 re

class CountPatt:
    def __init__(self,fname):
        self.fname = fname


    def 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] += 1
        return patt_dict

if __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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MS5248数模转换器可pin对pin兼容AD5648

MS5228/5248/5268 是一款 12/14/16bit 八通道输出的电压型 DAC&#xff0c;内部集成上电复位电路、可选内部基准、接口采用四线串口模式&#xff0c;最高工作频率可以到 40MHz&#xff0c;可以兼容 SPI、QSPI、DSP 接口和 Microwire 串口。可pin对pin兼容AD5648。输出接到一个 …

潮玩IP助力环境保护,泡泡玛特发布行业首款碳中和产品

在今年的2023上海PTS国际潮流玩具展上&#xff0c;泡泡玛特正式发布了首款“碳中和”潮玩产品DIMOO X蒙新河狸手办&#xff08;下简称DIMOO河狸&#xff09;&#xff0c;通过环保主题与流行文化的联合&#xff0c;让年轻人知道野生动物保护有多种方式&#xff0c;同时以创新的设…

Crypto(3)NewStarCTF 2023 公开赛道 WEEK2|Crypto-不止一个pi

题目代码 from flag import flag from Crypto.Util.number import * import gmpy2 p getPrime(1024) #这行生成一个大约1024位长度的随机素数&#xff0c;并将其赋给变量p。 q getPrime(1024) #类似地&#xff0c;这行生成另一个大约1024位长度的随机素数&#xff0c;并将其…

Fortinet详解如何量化网安价值,把握网安态势

网络安全价值量化是企业准确把握自身网络安全态势的前提&#xff0c;也是网络安全管理人员持续推动工作的有力支撑。网络安全行业发展迅速&#xff0c;其价值量化也在不断地演进&#xff0c;如何进行量化则一直都是企业和网络安全管理人员的挑战。近期&#xff0c;Fortinet 委托…

【视觉算法系列2】在自定义数据集上训练 YOLO NAS(上篇)

提示&#xff1a;免费获取本文涉及的完整代码与数据集&#xff0c;请添加微信peaeci122 YOLO-NAS是目前最新的YOLO目标检测模型&#xff0c;它在准确性方面击败了所有其他 YOLO 模型。与之前的 YOLO 模型相比&#xff0c;预训练的 YOLO-NAS 模型能够以更高的准确度检测更多目标…

【三】kubernetes kuboard部署分布式系统

#服务器 #部署 #云原生 #k8s 目录 一、前言二、搭建docker私有仓库三、系统搭建1、NFS部署1)部署nfs server &#xff08;192.168.16.200&#xff09;2)部署nfs client &#xff08;全部节点&#xff09;3)在Kuboard中创建 NFS 存储类 2、创建命名空间3、添加docker密文4、创建…

Nginx 配置文件解读

一.配置文件解读 nginx配置文件主要分为四个部分&#xff1a; main{ #&#xff08;全局设置&#xff09;http{ #服务器配置upstream{} #&#xff08;负载均衡服务器设置&#xff09;server{ #&#xff08;主机设置&#xff1a;主要用于指定主机和端口&#xff09;location{} …

Flink学习之旅:(三)Flink源算子(数据源)

1.Flink数据源 Flink可以从各种数据源获取数据&#xff0c;然后构建DataStream 进行处理转换。source就是整个数据处理程序的输入端。 数据集合数据文件Socket数据kafka数据自定义Source 2.案例 2.1.从集合中获取数据 创建 FlinkSource_List 类&#xff0c;再创建个 Student 类…

5256C 5G终端综合测试仪

01 5256C 5G终端综合测试仪 产品综述&#xff1a; 5256C 5G终端综合测试仪主要用于5G终端、基带芯片的研发、生产、校准、检测、认证和教学等领域。该仪表具备5G信号发送功能、5G信号功率特性、解调特性和频谱特性分析功能&#xff0c;支持5G终端的产线高速校准及终端发射机…

Dev-C++ 软件安装教程

Dev-C 软件安装包https://download.csdn.net/download/W_Fe5/88446511&#xff08;软件包下载后&#xff0c;右键解压&#xff09; 一、打开文件夹&#xff0c;双击“Dev-C” 二、软件安装&#xff0c;点击“OK” 三、点击“I Agree” 四、点击“Next” 五、更改安装目录&…

虚拟机ubantu系统突然重启失去网络

1.进入 root用户 cd /var/lib/NetworkManager然后查看网络服务状态 如果网络状态和我一样不可用 ,就先停止网络服务 service ModemManager stop#删除状态rm networker.stateservice ModemManager start

基于Pytorch的CNN手写数字识别

作为深度学习小白&#xff0c;我想把自己学习的过程记录下来&#xff0c;作为实践部分&#xff0c;我会写一个通用框架&#xff0c;并会不断完善这个框架&#xff0c;作为自己的入门学习。因此略过环境搭建和基础知识的步骤&#xff0c;直接从代码实战开始。 一.下载数据集并加…

【遮天】最新预告,叶凡一怒报仇,导演再删减人物,还暴露一个严重问题

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析遮天国漫资讯。 《遮天》动漫第30集预告已出&#xff0c;叶凡被挟持进入荒古禁地&#xff01;这一集看下来&#xff0c;导演又删减人物了&#xff0c;还暴露一个问题。 在预告中&#xff0c;叶凡已经被姬家和姜家的人带往…

【C++ 学习 ㉙】- 详解 C++11 的 constexpr 和 decltype 关键字

目录 一、constexpr 关键字 1.1 - constexpr 修饰普通变量 1.2 - constexpr 修饰函数 1.3 - constexpr 修饰类的构造函数 1.4 - constexpr 和 const 的区别 二、decltype 关键字 2.1 - 推导规则 2.2 - 实际应用 一、constexpr 关键字 constexpr 是 C11 新引入的关键字…

Spring Boot学习笔记(1)

Spring Boot学习笔记&#xff08;1&#xff09; 1.环境1.win2.mac3. IDEA 2.知识点1.Record类2.Switch开关表达式3. var和sealed4.springboot5.启用lombok 学习资料&#xff1a; 官网&#xff0c; 手册&#xff0c; 视频。 1.环境 1.win 1.下载vscode 2.安装jdk&#xff0…

求助C语言大佬:C语言的main函数参数问题

最近在敲代码的过程中&#xff0c;突发奇想&#xff0c;产生了一个疑问&#xff1a; 为什么main函数可以任由我们定义&#xff1a;可以接收一个参数、两个参数、三个参数都接接收&#xff0c;或者可以不接收&#xff1f;这是如何实现的 int main(){retrun 0; } int main (int…

移动app安全检测报告有什么作用?

移动app安全测试是一项至关重要的任务&#xff0c;它能够帮助确保移动应用程序在使用过程中不会受到各种安全威胁的侵害。在如今移动应用程序日益普及的时代&#xff0c;移动app安全测试尤为重要。移动app安全检测报告是基于专业的安全测试团队进行的全面分析后生成的&#xff…

博客积分上一万了

博客积分上一万了 继续努力&#xff0c;勇往直前。

JOSEF约瑟 JD3-40/23 JD3-70/23漏电继电器 AC220V\0.05-0.5A

JD3系列漏电继电器&#xff08;以下简称继电器&#xff09;适用于交流电压至1140V&#xff0c;频率为50Hz&#xff0c;该继电器与分励脱扣器或失压脱扣器的断路器、交流接触器、磁力启动器等组成漏电保护装置&#xff0c;作漏电和触电保护之用&#xff0c;可配备蜂鸣器、信号等…

短视频是“风口”还是“疯口”?

熟悉我的粉丝都知道&#xff0c;最近去追了下短视频的风口&#xff0c;折腾了几个视频出来。且不说视频效果如何&#xff0c;单单是制作视频的过程&#xff0c;就差点没要了童话的老命。看似短短的几分钟&#xff0c;真的应了那句话&#xff1a;台上一分钟&#xff0c;台下十年…