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

Python灰帽编程——错误异常处理和面向对象

文章目录

  • 1. 错误和异常
    • 1.1 基本概念
      • ==1.1.1 Python 异常==
    • 1.2 检测(捕获)异常
      • 1.2.1 try except 语句
      • 1.2.2 捕获多种异常
      • 1.2.3 捕获所有异常
    • 1.3 处理异常
    • 1.4 特殊场景
      • 1.4.1 with 语句
  • 2. 内网主机存活检测程序
    • 2.1 scapy 模块
      • 2.1.1 主要功能
      • 2.1.2 scapy 安装
      • 2.1.3 进入scapy 模块
      • 2.1.4 简单使用
    • 2.2 主机存活检测程序
  • 3. 面向对象编程
    • 3.1 类
      • 3.1.1 创建类
      • 3.1.2 \__init__ 方法
    • 3.2 方法
      • 3.2.1 绑定方法
    • 3.3 继承
      • 3.3.1 子类继承
      • 3.3.2 方法重写
      • 3.3.3 多重继承
    • 3.4 魔法函数
      • 3.4.1 类和实例的内建函数
      • 3.4.2 常用的魔法函数
    • 3.5 私有化

1. 错误和异常

如果遇到了错误(异常),如何去处理?

1.1 基本概念

1.1.1 Python 异常

当程序运行时,因为遇到未知的错误而导致中止运行,便会出现Traceback 消息,打印异常。异常即是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。一般情况下,在Python 无法正常处理程序时就会发生一个异常。异常是Python 对象,表示一个错误。当Python 脚本发生异常时我们需要响应处理它,否则程序会终止执行可以捕获异常。

异常描述
SyntaxError语法错误
NameError未声明/初始化对象
IndexError序列中没有此索引
KeyboardInterrupt用户中断执行(Ctrl+C)
EOFError没有内建输入,到达EOF 标记(Ctrl+D) 不适用windows 系统
IOError输入/输出操作失败
ValueError当操作或函数接收到具有正确类型但值不适合的参数, 并且情况不能用更精确的异常,例如 IndexError来描述时将被引发。
TypeError字符串与整数相加时触发。

1.2 检测(捕获)异常

如果一个语句发生了错误或异常,跳过该语句的执行,执行另外的语句。

1.2.1 try except 语句

监控异常

尝试执行try 语句,如果遇到异常(行不通)则执行except 语句。两个语句执行一个。

语法规则

try:pass                # 监控这里的异常
except Exception[, reason]:pass                # 异常处理代码

示例:

# 01 - 异常初探.pytry:		#尝试执行语句username = input("Please input your name: ")print(f"Welcome, {username}")except:		#如果遇到异常执行的语句print("\nSomething Error!")

1.2.2 捕获多种异常

算命脚本:输入年龄,预测明年的年龄。

可以把多个except 语句连接在一起,处理一个try 块中可能发生的多种异常。

# 02 - 捕获多种异常.pybanner = '''
杰哥的算命脚本
1. 预测年龄
2. 预测财运
3. 预测姻缘
'''print(banner)choice = input("Please input the number: ")
choice = int(choice)def guess_age():try:age = input("Please input your age: ")print(f"The next year your name: {int(age) + 1}")except ValueError:print("\nPlease input a number!")except KeyboardInterrupt:print("\nCtrl + C.END")except:print("\nSomething Error!")
if choice != 1:print("好好学习...")exit()
eles:guess_age()

1.2.3 捕获所有异常

如果出现的异常没有出现在指定要捕获的异常列表中,程序仍然会中断。可以使用在异常继承的树结构中,BaseException 是在最顶层的,所以使用它可以捕获任意类型的异常。

except BaseException:           # 捕获所有异常,相当于exceptprint("\nSomething Error!")

Pyhton 异常树

BaseException                                               所有异常的基类||+-- SystemExit                                         解释器请求退出||+-- KeyboardInterrupt                                  用户中断执行(通常是输入^C)||+-- GeneratorExit                                      生成器调用close();方法时触发的||+-- Exception                          常规错误的基类,异常都是从基类Exception继承的。|+-- StopIteration                                 迭代器没有更多的值|+-- StandardError                                 所有的内建标准异常的基类|    +-- BufferError                              缓冲区操作不能执行|    +-- ArithmeticError                          所有数值计算错误的基类|    |    +-- FloatingPointError                  浮点计算错误|    |    +-- OverflowError                       数值运算超出最大限制|    |    +-- ZeroDivisionError                   除(或取模)零 (所有数据类型)|    +-- AssertionError                           断言语句失败|    +-- AttributeError                           访问未知对象属性|    +-- EnvironmentError                         操作系统错误的基类|    |    +-- IOError                             输入输出错误|    |    +-- OSError                             操作系统错误|    |         +-- WindowsError (Windows)         系统调用失败|    |         +-- VMSError (VMS)                 系统调用失败|    +-- EOFError                                 没有内建输入,到达EOF 标记|    +-- ImportError                              导入模块/对象失败|    +-- LookupError              无效数据查询的基类,键、值不存在引发的异常|    |    +-- IndexError                          索引超出范围|    |    +-- KeyError                            字典关键字不存在|    +-- MemoryError              内存溢出错误(对于Python 解释器不是致命的)|    +-- NameError                未声明/初始化对象 (没有属性)|    |    +-- UnboundLocalError                   访问未初始化的本地变量|    +-- ReferenceError           弱引用(Weak reference)试图访问已经垃圾回收了的对象|    +-- RuntimeError                             一般的运行时错误|    |    +-- NotImplementedError                 尚未实现的方法|    +-- SyntaxError                              语法错误|    |    +-- IndentationError                    缩进错误|    |         +-- TabError                       Tab 和空格混用|    +-- SystemError                              一般的解释器系统错误|    +-- TypeError                                对类型无效的操作|    +-- ValueError                               传入无效的参数|         +-- UnicodeError                        Unicode 相关的错误|              +-- UnicodeDecodeError             Unicode 解码时的错误|              +-- UnicodeEncodeError             Unicode 编码时错误|              +-- UnicodeTranslateError          Unicode 转换时错误|+-- Warning                                       警告的基类+-- DeprecationWarning                       关于被弃用的特征的警告+-- PendingDeprecationWarning                关于特性将会被废弃的警告+-- RuntimeWarning              可疑的运行时行为(runtime behavior)的警告+-- SyntaxWarning                            可疑的语法的警告+-- UserWarning                              用户代码生成的警告+-- FutureWarning                            关于构造将来语义会有改变的警告+-- ImportWarning               关于模块进口可能出现错误的警告的基类。+-- UnicodeWarning                           有关Unicode警告的基类。+-- BytesWarning                             有关字节警告相关的基类。

1.3 处理异常

try:                                                # 尝试执行某个语句num = int(input("The number:"))
except BaseException:                               # 如果遇到异常,执行的语句print("something error!")
else:                                               # 如果没有遇到异常,执行的语句print(num)
finally:                                            # 不管是否遇到异常,都要执行的语句。print("This is finally")
  • else 子句:在try 范围中没有异常被检测到时,执行else 子句。在else 范围中的任何代码运行前,try 范围中的所有代码必须完全成功。

  • finally 子句:finally 子句是无论异常是否发生,是否捕捉都会执行的一段代码。比如获取用户的输入,写入文件,但是如果在获取数据过程中,发生了异常,就会导致整个脚本结束执行,文件也无法关闭了。为了解决这个问题,可以采用异常处理中的finally 子句,也就是说,无论语句是否正常执行,都需要关闭。

# 03 - 处理异常.pybanner = '''
杰哥的算命脚本
1. 预测年龄
2. 预测财运
3. 预测姻缘
'''print(banner)choice = input("Please input the number: ")
choice = int(choice)def guess_age():try:age = input("Please input your age: ")age = int(age) except ValueError:print("\nPlease input a number!")except KeyboardInterrupt:print("\nCtrl + C")except:print("\nSomething Error!")else:print(f"The next year your name: {age + 1}")finally:print("杰哥算命脚本执行结束,祝你好运!")
if choice != 1:print("好好学习...")exit()
else:guess_age()

1.4 特殊场景

1.4.1 with 语句

with 语句是用来简化代码的。比如在将打开文件的操作放在with 语句中,代码块结束后,文件将自动关闭。用来简化文件操作的打开和关闭,其中closed 属性是判断文件是否被关闭的

>>> with open('foo.py') as f:

2. 内网主机存活检测程序

网络模型:

应用层
表示层
会话层			应用层			应用层		http|ftp|dns|dhcp
传输层			传输层			传输层		tcp|udp
网络层			网络层			网络层		ip
数据链路层	  数据链路层
物理层			物理层			网络接口层

2.1 scapy 模块

与scrapy 有非常大的区别。

scapy 是一个Python 的第三方模块,被称为“网络神器”。scapy 模块能够发送、捕获、分析和铸造网络数据包。

2.1.1 主要功能

image-20230918164702051

2.1.2 scapy 安装

Windows 下安装scapy

python -m pip install scapy

依赖

Kali 中自带scapy 环境。

2.1.3 进入scapy 模块

┌──(ajest zh-CN)-[~]
└─$ sudo scapy                     aSPY//YASa       apyyyyCY//////////YCa       |sY//////YSpcs  scpCY//Pp     | Welcome to Scapyayp ayyyyyyySCP//Pp           syY//C    | Version 2.4.5AYAsAYYYYYYYY///Ps              cY//S   |pCCCCY//p          cSSps y//Y   | https://github.com/secdev/scapySPPPP///a          pP///AC//Y   |A//A            cyP////C   | Have fun!p///Ac            sC///a   |P////YCpc           A//A   | Craft packets before they craftscccccp///pSP///p          p//Y   | you.sY/////////y  caa           S//P   |                      -- SocratecayCyayP//Ya              pY/Ya   |sY/PsY////YCc          aC//Yp sc  sccaCY//PCypaapyCP//YSs  spCPY//////YPSps    ccaacs         using IPython 7.22.0
>>>

2.1.4 简单使用

构造数据包

>>> pkt = IP()/TCP()
>>> pkt.show()
###[ IP ]### version   = 4ihl       = Nonetos       = 0x0len       = Noneid        = 1flags     = frag      = 0ttl       = 64proto     = tcpchksum    = Nonesrc       = 127.0.0.1dst       = 127.0.0.1\options   \
###[ TCP ]### sport     = ftp_datadport     = httpseq       = 0ack       = 0dataofs   = Nonereserved  = 0flags     = Swindow    = 8192chksum    = Noneurgptr    = 0options   = ''>>> pkt = IP(src = "192.168.1.11", dst = "192.168.1.1")/TCP()		#src:发送方dst:接收方
>>> pkt.show()
###[ IP ]### version   = 4ihl       = Nonetos       = 0x0len       = Noneid        = 1flags     = frag      = 0ttl       = 64proto     = tcpchksum    = Nonesrc       = 192.168.1.11dst       = 192.168.1.1\options   \
###[ TCP ]### sport     = ftp_datadport     = httpseq       = 0ack       = 0dataofs   = Nonereserved  = 0flags     = Swindow    = 8192chksum    = Noneurgptr    = 0options   = ''>>>

发送数据包

发送数据包的函数说明
sr(pkt)发送数据包,接收所有返回包
sr1(pkt)发送数据包,接收(等待)一个返回包
send(pkt)发送数据包,不等待返回包
srp(pkt)发送2 层数据包,等待回应
sendp(pkt)发送2 层数据包,不等待返回包
>>> res = sr1(pkt)
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
>>>

在发送数据包的时候,再接收返回包,网卡一直处于监听状态,接收监听的数据包,一直等待回应。直到接收到返回包。接到返回包,主机在线,接不到返回包,主机不在线。

查看返回包

>>> res.show()
###[ IP ]### version   = 4ihl       = 5tos       = 0x0len       = 44id        = 13990flags     = frag      = 0ttl       = 255proto     = tcpchksum    = 0x46a4src       = 10.9.21.1dst       = 10.9.21.111\options   \
###[ TCP ]### sport     = httpdport     = ftp_dataseq       = 1510518667ack       = 1dataofs   = 6reserved  = 0flags     = SAwindow    = 65535chksum    = 0x4f9curgptr    = 0options   = [('MSS', 1460)]
###[ Padding ]### load      = '\x00\x00'>>>

2.2 主机存活检测程序

icmp的回应包:0

# 04 - 内网主机存活检测程序.pyfrom scapy.all import *
from scapy.layers.inet import *
from termcolor import coloredimport logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)		#屏蔽信息的模块,scapy运行期间,只有ERROR才显示即其他的都不显示。netmask = "192.168.16."     #接收端的网络位
src = "192.168.16.177"      #发送端for i in range(1, 255):dst = f"{netmask}{i}"        #接收端pkt = IP(src = src, dst = dst)/ICMP()	#创建数据包res = sr1(pkt, timeout = 1, verbose = False)	#发送数据包等待回应,等待一秒,一秒后没有回应当作不在线,禁止详细输出if res and res.type == 0:print(colored(f"\n{dst} is ALIVE!","green"))else: print(f"\r{dst} is NOT LIVE!!!",end = "")		#输出目的主机不存活,end=""使结果原地输出

3. 面向对象编程

编写POC平台:

goby,nuclei			yaml语言pocsuite3			高仿msfpy语言yakityak语言

3.1 类

类是一类事物的统称,比如学生。对象就是类的实例化。

类有属性(变量),比如学生的姓名、性别、年龄、成绩等,也就是编程里面的变量。

类有方法(函数),比如学生的上课、下课等,也就是编程里面的函数。

3.1.1 创建类

类是一种数据结构,我们可以用它来定义对象,对象把数据值和行为特性融合在一起。Python 使用class 关键字来创建类:通常类名的第一个字母大写,推荐使用驼峰式命名法,单词首字母均大写。类有属性(变量)和方法(动作,函数)组成。

class ClassName(bases):'class documentation string'    #'类文档字符串'class_suite                     # 类体

3.1.2 _init_ 方法

__init__() 是类的实例(对象)创建后第一个被调用的方法,通常被用来进行对象中属性(变量)的初始化。设置实例的属性可以在实例创建后任意时间进行,但是通常情况下优先在__init__() 方法中实现。

  • 定义类型
  • 实例化对象(创建一个对象)
  • 初始化对象(第一次给对象属性赋值)
# 05 - __init__.pyclass Stu():#self:是一个特殊的参数,他对类的实例(对象)本身。在类的方法中,只用self参数可以访问该对象的属性和方法def __init__(self, name, sex, age, score):self.name = nameself.sex = sexself.age = ageself.score = scorestu1 = Stu(name = "XJ", sex = True, age = 24, score = 59.9)	#在传参的时候,stu1传给类中的self,name传给类中的name...在类中相当于:stu1.name = "XJ",stu1.sex = True,stu1.age = 24...print(f"{stu1.name} 的成绩是{stu1.score}")

3.2 方法

3.2.1 绑定方法

方法仅仅是类内部定义的函数,方法只有在其所属的类拥有实例时,才能被调用;任何一个方法定义中的第一个参数都是变量self,它表示调用此方法的实例对象就是自己。

类中的方法,也就是类中定义的函数,这个函数第一个参数永远是self,表示自己。

# 06 - 绑定方法.pyimport timeclass Stu():def __init__(self, name, sex, age, score):self.name = nameself.sex = sexself.age = ageself.score = scoredef getSocre(self):print(f"{self.name} 的成绩是{self.score}")def goodGoodStudy(self):print("好好学习中...")time.sleep(10)self.score += 0.1stu1 = Stu(name = "LH", sex = True, age = 24, score = 59.9)
stu2 = Stu(name = "HMM", sex = True, age = 24, score = 89.9)stu2.getSocre()
stu2.goodGoodStudy()
stu2.getSocre()

3.3 继承

3.3.1 子类继承

继承描述了基类(祖先)的属性如何遗传给派生类(子孙),子类可以继承它的基类的任何属性,不管是数据属性还是方法。

# 34 - 子类继承.pyimport timeclass Kid():def __init__(self, name = "", sex = "", age = ""):self.name = nameself.age = ageself.sex = sexdef play(self):print("玩游戏中...")class Stu(Kid):def __init__(self,name = "", sex = "", age = "", score = ""):Kid.__init__(self, name, sex, age)self.score = scoredef get_score(self):print(f"{self.name} 的成绩是{self.score}")def good_good_study(self):print("好好学习中...")time.sleep(10)self.score += 0.1stu1 = Stu(name = "XJ", sex = True, age = 24, score = 59.9)
stu2 = Stu(name = "LL", sex = True, age = 25, score = 49.9)
stu3 = Stu(name = "HMM", sex = True, age = 23, score = 99.9)
stu4 = Stu(name = "LH", sex = True, age = 24, score = 79.9)stu1.play()

3.3.2 方法重写

如果子类中有和父类同名的方法,父类方法将被覆盖;如果需要访问父类的方法,则要调用一个未绑定的父类方法,明确给出子类的实例。

# 08 - 方法重写.pyimport timeclass Kid():def __init__(self, name, sex, age):self.name = nameself.sex = sexself.age = agedef play(self):print("玩游戏中...")class Stu(Kid):def __init__(self, name, sex, age, score):Kid.__init__(self, name, sex, age)self.score = score	#Stu类继承了Kid类。在它的构造函数中,除了接受与Kid相同的三个参数外,还接受一个额外的参数score(分数)。Kid.__init__(self, name, sex, age)用于调用父类Kid的构造函数,以便初始化父类的属性。同时,Stu类还定义了一个自己的属性score,并将score的参数值赋给它。def getSocre(self):print(f"{self.name} 的成绩是{self.score}")def goodGoodStudy(self):print("好好学习中...")time.sleep(10)self.score += 0.1def play(self):print("玩王者荣耀中...")time.sleep(2)self.score -= 10stu1 = Stu(name = "AJEST", sex = True, age = 24, score = 59.9)
stu2 = Stu(name = "HMM", sex = True, age = 24, score = 89.9)stu2.getSocre()
stu2.play()
stu2.getSocre()
stu2.goodGoodStudy()
stu2.goodGoodStudy()
stu2.getSocre()
stu2.play()
stu2.getSocre()

3.3.3 多重继承

Python 允许多重继承,即一个类可以是多个父类的子类,子类可以拥有所有父类的属性。

# 09 - 多重继承.pyclass A():def a(self):print("This is function A!")class B():def b(self):print("This is function B!")class C(A, B):pass
C = C()
C.a()
C.b()

解释:

  • 在Python中,pass 是一个空语句,不执行任何操作。当你在代码中遇到需要写一段代码但又暂时没有实现的情况时,可以使用 pass 来占位,使得代码结构完整而没有语法错误。

  • 多重继承是指一个类可以继承自多个父类的特性和方法。在Python中,多重继承可以通过在类定义时指定多个父类来实现。

    当一个类继承自多个类时,它继承了这些父类的属性和方法。这意味着子类可以使用来自所有父类的特性,并且可以在自己的定义中添加新的属性和方法。

    下面是一个简单的示例,演示了多重继承的概念:

    class A:def method_a(self):print("这是A类的方法")class B:def method_b(self):print("这是B类的方法")class C(A, B):def method_c(self):print("这是C类的方法")# 创建C类的对象
    obj = C()# 调用来自父类A和B的方法
    obj.method_a()  # 输出:这是A类的方法
    obj.method_b()  # 输出:这是B类的方法# 调用自己的方法
    obj.method_c()  # 输出:这是C类的方法
    

    在上面的代码中,类A和B分别定义了method_a和method_b两个方法。类C继承自A和B,因此它拥有这两个父类的方法。然后,通过创建C类的对象obj,我们可以调用来自父类A和B的方法,也可以调用C类自己的方法method_c。

    需要注意的是,当一个类继承自多个父类时,如果不同父类中存在同名的方法或属性,Python解释器将按照特定的顺序(称为方法解析顺序)来查找和调用。方法解析顺序由C3线性化算法确定,它确保解析顺序是一种合理且一致的方式。在Python中,可以使用c3_linearize()函数来查看类的方法解析顺序。

    多重继承的使用必须慎重,因为它可以引起一些复杂的问题,例如方法冲突和命名空间冲突。因此,在使用多重继承时,需要仔细考虑类与类之间的关系,以及方法和属性的命名以避免冲突。

3.4 魔法函数

3.4.1 类和实例的内建函数

函数作用
issubclass()判断一个类是另一个类的子类或子孙类
isinstance()判定一个对象是否是另一个给定类(可以是一个父类的子孙类,也可以是一个子类的父类)的实例
hasattr()判断一个对象是否有一个特定的属性
getattr()获得一个对象的属性值
setattr()设置一个对象的属性
delattr()删除一个对象的属性

3.4.2 常用的魔法函数

魔法函数是系统自带的,会在“恰当”的时候自动调用。

# 10 - 魔术方法.pyclass Test():def __init__(self):print("Function __init__ is called!")def __str__(self):return "Why print(self)?"def __call__(self):print("Why call me like Function?")t = Test()print(t)t()

解释:

在Python中,魔法函数(Magic methods)是一类特殊的函数,以双下划线(__)开头和结尾的方法。它们也被称为特殊方法或双下方法。

魔法函数在Python中用于定义自定义类的行为,使其具有类似内置类型的行为。当某些特定的操作发生时(例如实例创建、对象调用、属性访问等),魔法函数会被自动调用。

下面是一些常见的魔法函数的详细解释和示例:

  1. __init__: 这是一个构造函数,用于创建对象实例。它在对象被创建时自动调用,常用于初始化对象的属性。

    class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("John", 30)
    print(person.name)  # 输出: John
    print(person.age)   # 输出: 30
    
  2. __str____repr__: __str__ 用于定义对象的字符串表示形式,对于用户的友好输出有很大作用;而 __repr__ 则用于定义对象的技术细节表示形式,主要用于调试和开发。

    class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"Person(name={self.name}, age={self.age})"def __repr__(self):return f"Person(name='{self.name}', age={self.age})"person = Person("John", 30)
    print(str(person))   # 输出: Person(name=John, age=30)
    print(repr(person))  # 输出: Person(name='John', age=30)
    
  3. __len__: 该方法定义了对象的长度。使用内建函数 len() 调用对象时,实际上是调用了对象的 __len__ 方法。

    class MyList:def __init__(self, elements):self.elements = elementsdef __len__(self):return len(self.elements)my_list = MyList([1, 2, 3, 4, 5])
    print(len(my_list))  # 输出: 5
    
  4. __getitem____setitem__: 这些方法定义了对象的索引操作行为。可以通过方括号 [] 访问对象中的元素,而实际上是调用了对应的魔法函数。

    class MyList:def __init__(self, elements):self.elements = elementsdef __getitem__(self, index):return self.elements[index]def __setitem__(self, index, value):self.elements[index] = valuemy_list = MyList([1, 2, 3, 4, 5])
    print(my_list[2])    # 输出: 3
    my_list[2] = 10
    print(my_list[2])    # 输出: 10
    
  5. __call__: 使得对象可以像函数一样被调用。在对象后面加括号时,会自动调用该对象的 __call__ 方法。

    class Calculator:def __call__(self, a, b):return a + bcalculator = Calculator()
    result = calculator(3, 5)
    print(result)  # 输出: 8
    

还有很多其他的魔法函数,例如 __add__(用于定义对象相加操作)、__sub__(用于定义对象相减操作)、__eq__(用于定义对象相等比较操作)等等。通过定义这些魔法函数,可以使得自定义类的实例表现得更加像内置类型,提供更多的灵活性和可定制性。

3.5 私有化

Python 为类元素(属性和方法)的私有性提供初步的形式,由双下划线开始的属性在运行时被“混淆”,所以直接访问是不允许的。

# 11 - 私有化.py# 06 - 绑定方法.pyimport timeclass Stu():def __init__(self, name, sex, age, score):self.name = nameself.sex = sexself.age = ageself.__score = scoredef getSocre(self):print(f"{self.name} 的成绩是{self.__score}")	#允许访问成绩def goodGoodStudy(self):print("好好学习中...")time.sleep(10)self.__score += 0.1stu1 = Stu(name = "AJEST", sex = True, age = 24, score = 59.9)
stu2 = Stu(name = "HMM", sex = True, age = 24, score = 89.9)stu2.getSocre()
ator()result = calculator(3, 5)print(result)  # 输出: 8

还有很多其他的魔法函数,例如 __add__(用于定义对象相加操作)、__sub__(用于定义对象相减操作)、__eq__(用于定义对象相等比较操作)等等。通过定义这些魔法函数,可以使得自定义类的实例表现得更加像内置类型,提供更多的灵活性和可定制性。

相关文章:

Python灰帽编程——错误异常处理和面向对象

文章目录 1. 错误和异常1.1 基本概念1.1.1 Python 异常 1.2 检测(捕获)异常1.2.1 try except 语句1.2.2 捕获多种异常1.2.3 捕获所有异常 1.3 处理异常1.4 特殊场景1.4.1 with 语句 2. 内网主机存活检测程序2.1 scapy 模块2.1.1 主要功能2.1.2 scapy 安装…...

【20230919】win11无法删除Chrome注册表项

win11无法删除Chrome注册表项 删除以下注册表项发生错误: 计算机\HKEY_LOCAL_MACHINE\SOFTWAR\Google计算机\HKEY_CURRENT_USER\Software\Google 尝试了很多删除注册表方法(例如:编辑remove.reg文件),都不行。 无法…...

TCP/IP客户端和服务器端建立通信过程

客户端和服务器端建立通信过程 使用Qt提供的类进行基于TCP的套接字通信需要用到两个类: QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。 QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。服务…...

Python ---使用Fake库向clickhouse造数据小案例

每次insert太麻烦了 先在clickhosue中建表 test_user表 CREATE TABLE dwh.test_user (name String,age Int32,address String,phone String,email String ) ENGINE MergeTree() ORDER BY name; 此时表中暂无数据 用Python脚本来造一些数据 from faker import Faker from c…...

09MyBatisX插件

MyBatisX插件 在真正开发过程中对于一些复杂的SQL和多表联查就需要我们自己去编写代码和SQL语句,这个时候可以使用MyBatisX插件帮助我们简化开发 安装MyBatisX插件: File -> Settings -> Plugins -> 搜索MyBatisx插件搜索安装然后重启IDEA 跳转文件功能 由于一个项…...

使用 Messenger 跨进程通信

什么是Messenger Messenger 也是IPC的方案之一,是基于消息的跨进程通信。基于消息是什么意思?Handler是我们最常用的消息机制,所以 Messenger 对于使用者来说就像是使用 Handler。实际上 Messenger 就是 AIDL 的上层封装而已,它们…...

Spring Cloud Gateway

路由谓词工厂 Route Predicate Factory 1. The After Route Predicate Factory spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After2017-01-20T17:42:47.789-07:00[America/Denver]# 用日期时间匹配 2. The Before Route Pr…...

JVM 优化技术

文章目录 JVM 优化技术概述方法内联优化说明优点内联条件 栈帧之间数据共享说明优点栈帧之间数据共享条件 JVM 优化技术 概述 JVM常见的优化技术: 方法内联优化。栈帧之间数据共享。 方法内联优化 说明 方法内联(Method Inlining)是JVM…...

【MySQL系列】- MySQL自动备份详解

【MySQL系列】- MySQL自动备份详解 文章目录 【MySQL系列】- MySQL自动备份详解一、需求背景二、Windows mysql自动备份方法2.1 复制date文件夹备份实验备份环境创建bat直接备份脚本 2 .2 mysqldump备份成sql文件创建mysqldump备份脚本 2 .3 利用WinRAR对MySQL数据库进行定时备…...

指针笔试题讲解-----让指针简单易懂(2)

目录 回顾上篇重点 : 一.笔试题 ( 1 ) 二.笔试题 ( 2 ) 科普进制知识点 (1) 二进制 (2) 八进制 (3)十六进制 三.笔试题( 3 ) 四.笔试题( 4 ) 五.笔试题( 5 ) 六.笔试题( …...

使用windbg分析dump文件的方法

https://zhuanlan.zhihu.com/p/613434365 一般操作如下: 准备工作。 打开dump文件。指定符号表文件的路径。指定可执行文件的路径。指定源码文件的路径。在windbg的命令行,输入并执行如下命令 .reload,重新加载前述数据文件。!analyze -v&a…...

【论文阅读 07】Anomaly region detection and localization in metal surface inspection

比较老的一篇论文,金属表面检测中的异常区域检测与定位 总结:提出了一个找模板图的方法,使用SIFT做特征提取,姿态估计看差异有哪些,Hough聚类做描述符筛选,仿射变换可视化匹配图之间的关系&#xf…...

SSM - Springboot - MyBatis-Plus 全栈体系(十一)

第二章 SpringFramework 五、Spring AOP 面向切面编程 6. Spring AOP 基于 XML 方式实现(了解) 6.1 准备工作 加入依赖和基于注解的 AOP 时一样。准备代码把测试基于注解功能时的 Java 类复制到新 module 中,去除所有注解。 6.2 配置 Sp…...

深度剖析贪心算法:原理、优势与实战

概述 贪心算法是一种通过每一步的局部最优选择来寻找整体最优解的方法。在每个步骤中,贪心算法选择当前状态下的最佳选项,而不考虑未来可能的影响。尽管它不能保证一定能找到全局最优解,但贪心算法通常简单且高效,适用于许多实际…...

Docker搭建DNS服务器--use

前言 DNS服务器是(Domain Name System或者Domain Name Service)域名系统或者域名服务,域名系统为Internet上的主机分配域名地址和IP地址。 安装 2.1 实验环境 IP 系统版本 角色 192.168.40.121 Ubuntu 22.10 DNS服务器 192.168.40.122 Ubuntu 22.10 测试机器 2.2 …...

“顽固”——C语言用栈实现队列

解题图解: 1、 先用stack1存储push来的数据 2、每当要pop数据时,从stack2中取,如果 stack2为空,就先从stack1中“倒”数据到stack2。 这就是用栈实现队列的基本操作 这道题看起来比较容易,但是!如果你用C语…...

linux内网渗透

一、信息收集 主机发现: nmap -sP 192.168.16.0/24 端口探测 masscan -p 1-65535 192.168.16.168 --rate1000 开放端口如下 nmap端口详细信息获取 nmap -sC -p 8888,3306,888,21,80 -A 192.168.16.168 -oA ddd4-port目录扫描 gobuster dir…...

还没用熟 TypeScript 社区已经开始抛弃了

根据 rich-harris-talks-sveltekit-and-whats-next-for-svelte 这篇文章的报道, Svelte 计划要把代码从 TS 换到 JS 了。 The team is switching the underlying code from TypeScript to JavaScript. That and the update will then allow the team to incorporate…...

2023年9月19日

2> 完成文本编辑器的保存工作 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QFontDialog> #include <QMainWindow> #include <QFont> #include <QMessageBox> #include <QDebug> #include <QColorDialog> #include &l…...

PowerDesigner 与 mysql 同步数据

PowerDesigner 连接上数据库 创建数据库表 table_5 选择&#xff1a; 点击确认后弹出 点击run执行 刷新数据库表&#xff0c;已创建成功 修改测试表1&#xff0c;新增一个字段 取消全选 选择数据库&#xff0c;勾选修改的表&#xff0c;如果全部勾选的话&#xff0c;就…...

[python 刷题] 271 Encode and Decode Strings

[python 刷题] 271 Encode and Decode Strings 题目&#xff1a; Design an algorithm to encode a list of strings to a string. The encoded string is then sent over the network and is decoded back to the original list of strings. Machine 1 (sender) has the func…...

[QT]day3

1.一个闹钟 widget.cpp: #include "widget.h" #include "ui_widget.h"#include <QWidget> #include <QTimerEvent> //定时器事件处理类 #include <QTime>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {//给播…...

《PostgreSQL事务管理深入解析》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…...

深度分析Oracle中的NULL

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 关键点 特殊值NULL意味着没有数据&#xff0c;它声明了该值是未知的事实。默认情况下&#xff0c;任何类型的列和变量都可以取这个值&#xff0c;除非它们有一个NOT N…...

Python入门教学——类和对象

目录 一、面向过程和面向对象 1、面向过程 2、面向对象 二、类 三、类对象与类属性 1、类对象 2、类属性 四、类方法与静态方法 1、类方法 2、静态方法 一、面向过程和面向对象 1、面向过程 是一种以过程为中心的编程思想&#xff0c;强调事件的流程和顺序。思想&…...

【数据库系统概论】关系数据库中的关系数据结构

前言关系关系模式关系数据库关系模型的存储结构感谢 &#x1f496; 前言 上一篇文章【数据库系统概论】数据模型介绍了数据库系统中的数据模型的基本概念。其中提到了关系模型是最重要的一种数据模型。下面将介绍支持关系模型的数据库系统——关系数据库。 按照数据模型的三大…...

LabVIEW对Table中同一行数据分多次增加

LabVIEW对Table中同一行数据分多次增加 在对多个设备采集数据&#xff0c;同时需要记录到表格中。很多时候多台数据并不是同时更新&#xff0c;比如有的是在开关之前读取更新&#xff0c;有的则是在开关闭合后更新。只是用Number Indicator的方式&#xff0c;需要很多个&#…...

微信小程序实现删除功能

1. 前端 项目列表展示是使用的wx&#xff1a;for遍历 每个项目展示有3个模块 1. project-title 2. project-content 3. project-foot 全部代码如下 <t-sticky><view class"search"><t-search model:value"{{conditions.keyword}}" pl…...

整合Shiro+Jwt

整合ShiroJwt大体思路 springboot整合shiro大体上的思路&#xff1a; 1.自定义一个类Realm extends AuthorizingRealm{} 主要是对token授权和认证 重写2个方法 doGetAuthorizationInfo //授权 doGetAuthenticationInfo //认证 认证 代码中手动加上对token校验的判断2.自…...

Python 图形化界面基础篇:创建工具栏

Python 图形化界面基础篇&#xff1a;创建工具栏 引言 Tkinter 库简介步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建工具栏步骤4&#xff1a;向工具栏添加工具按钮步骤5&#xff1a;处理工具按钮的点击事件步骤6&#xff1a;启动…...

企业网站设计合同/浙江网站建设营销

目录 快速入门 1.基础标签 练习&#xff1a;公司简介案例 2.图片、音频、视频标签 3.超链接标签 4.列表标签 5.表格标签 练习&#xff1a;课程表 6.布局标签 7.表单标签 基本使用 表单项 快速入门 <html><head><title>html 快速入门</title&g…...

私做政府网站什么罪/深圳网络推广优化

【来信】   贺老师你好&#xff0c;我是一名普通二本网络工程专业的大三学生。眼看着大三上学期又要结束了&#xff0c;非常的焦虑。之前一直没有好好学习&#xff0c;学的东西少之又少&#xff0c;大三下学期结束就要开始找实习了。学校开了java基础课程&#xff0c;这学期就…...

powered by wordpress/云南今日头条新闻

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于java的外卖点菜系统&#xff0c;管理员通过后台添加菜品&#xff0c;用户浏览器登录&#xff0c;查看菜品、购买、下单等。根据需求&#xff0c;本系统采用的是BS&#xff08;Browser Server简称浏览器服…...

能源门户网站建设/排名函数rank怎么用

文章目录一、LVS负载均衡概念二、LVS负载均衡之NAT方式1、工作过程图解&#xff1a;2、通过上述其工作过程&#xff0c;总结一下NAT方式的特点三、LVS负载均衡之NAT方式配置流程详解3、实验步骤&#xff1a;&#xff08;1&#xff09;查看ip_vs模块是否加载&#xff08;2&#…...

赣县企业网站建设/产品营销策划方案

Linux 性能测试与分析 Revision History Version Date Author Description 1.0 2011/5/26 dengwutaobao.com 初稿 1.1 2011/6/23 dengwutaobao.com 添加CPU分析 1.2 2012/2/20 dengwutaobao.com 添加MEM,IO分析 1.3 2012/2/23 dengwutaobao.com 更新工作原…...

做公司网站棋牌/购买友情链接

今天说说以***者的角度去谈谈服务器被干掉后&#xff0c;我们该做的哪些防护和检查工作&#xff0c;高手的话都比较熟悉系统加固和安全的问题&#xff0c;对于我等初学者来说&#xff0c;没有做过从事过安全方面工作&#xff0c;所以只能从***者的角度去说说相对立的工作。因为…...