一.logging模块
定义:Python 的 logging
模块是一个灵活的日志记录系统,它允许应用程序通过不同的日志级 别记录消息,并将这些消息输出到各种目的地,例如控制台、文件或通过网络发送。以下是一些 基本的 logging
模块用法:
-
导入模块:
import logging
-
配置日志: 使用
logging.basicConfig()
方法可以快速设置日志的基本配置,包括日志级别、日志文件名、日志格式等。
-
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
-
设置日志级别: 日志级别从低到高分为:DEBUG, INFO, WARNING, ERROR,CRITICAL。
logging.debug("这是一个 debug 级别的日志") logging.info("这是一个 info 级别的日志") logging.warning("这是一个 warning 级别的日志") logging.error("这是一个 error 级别的日志") logging.critical("这是一个 critical 级别的日志")
-
创建日志记录器: 可以创建自己的日志记录器,用于不同模块或部分的日志记录。
logger = logging.getLogger('my_logger') handler = logging.FileHandler('my_log.log') formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) logger.debug("这是自定义记录器的 debug 日志")
-
日志处理器: 日志处理器(Handlers)负责将日志消息发送到不同的目的地,如文件、网络等。
-
日志过滤器: 可以添加过滤器来进一步控制日志消息的输出。
-
日志格式化: 可以自定义日志的格式,包括时间戳、日志级别、消息等。
-
日志旋转: 可以使用
RotatingFileHandler
或TimedRotatingFileHandler
来自动旋转日志文件,避免单个日志文件过大。 -
网络日志: 可以使用
SocketHandler
或HTTPHandler
将日志发送到远程服务器。 -
配置文件: 可以使用配置文件来设置日志系统,例如使用 JSON 或 INI 格式的文件。
使用 logging
模块可以帮助你更好地管理和记录应用程序的运行情况,对于调试和生产环境中的问题排查都非常有用。
二。4位验证码
import random
code = ''
for i in range(4):
cur = random.randrange(0,4)
if cur != i:
temp = chr(random.randint(65,90)) # chr函数主要用来表示ascii码对应的字符,会把整数转换成字符
else:
temp = random.randint(0,9)
code += str(temp)
print( code)
三.加密模块
hashlib 加密模块
(1)用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。
比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。
(2) 引用过程:
import hashlib
md5 = hashlib.md5("你好".encode("utf-8")) #实例化 把类的功能赋值给变量
print(md5.hexdigest())
md5.update('世界'.encode("utf-8"))
print(md5.hexdigest())
import hashlib
# sha 256算法
h = hashlib.sha256()
# 要计算的元数据必须是字符串格式
# 字符串对象需要encode转换为字节串对象
h.update("你好".encode())
# 产生哈希值对应的bytes对象
resultBytes = h.digest()
resultHex = h.hexdigest()
print(resultHex)
3.模块的安装:
pip install 模块名
四. 面向对象编程
1.定义:Python全面采用了面向对象的思想,是真正的面向对象的编程语言.一切皆为对象 OOP(Object oriented programming)面向对象,一种针对大型软件程序的编程思
- 2.特点
- 扩展性强,可读性好
- 使编程就和堆积木一样
- 将数据(属性)和操作方法(函数)全部封装到对象中
- 组织代码的方式更加接近人的思维
(1)面向对象与面向过程
- 区别
四.面向对象三要素
1.封装
四.面向对象的三要素
1.封装
- 面向过程思维
- "执行者"思维,适合编写小规模程序
- 我们首先思考"按照什么步骤"实现,一步一步最终完成,适合一些简单的事情,不需要协作关注"程序的逻辑流程"
- 例如:
- 开车 (发动车->挂挡->踩油门->走喽)
- 做饭 (买菜->洗菜->切菜->开火炒菜->开饭了)
- 面向对象思维
- "设计者"思维,适合编写大型程序
- 更加关注"对象之间的关系"
- 我们首先思考"怎么设计这个东西"
- 然后通过分工协作来完成,每个类完成一个部分
- 例如造车\飞机\轮船\火箭,我们必须先要确定这些复杂的设备是由什么构成的。
- 我们把这个东西拆分成一个个的物体object(对象)
- 面向过程思维
2.两者的相同点
- 都是解决问题的思维方式
- 都是代码的组织方式
-
人天然就有的能力
面向对象:
1.组装:将数据和操作组装到一起。将和对象的属性和操作这些属性的方法放入到同一个类中。
隐藏数据:对象只暴露一些接口,通过接口访问对象。例如:汽车驾驶员通过方向盘、油门、刹车、挂挡来操作汽车,可以不需要了解汽车的机动原理。
- 2.继承
- 子类继承父类之后,子类自动拥有类父类的所有公开的属性和方法。
- 多复用,继承来就不需要自己写了。
- 多继承少修改,OCP原则(OCP 原则就是 " 开- 闭原则 " ,一个软件应该对扩展开放,对修改关闭),使用继承改变,体现个性。(你定义好一个这个副类,副类里定义好对所有类的这个处理方案,然后呢,之后你需要添加新的功能,新的网站,你只要加新的。子类,去继承这个子类就可以了,那这样儿的话你就可以无限扩展,比如说爬虫儿的话,就是你写好之后就可以无限添加新的网站的抓取,就只要加新的类就可以了。)
- 多态
- Python崇尚鸭子类型实现多态,一个动物,走起路来像鸭子,叫声也像鸭子,那么我们就认为它是鸭子。(不同的类中,使用相同的方法命名类似的功能。)
- 面向对象编程最灵活的地方,动态绑定 (把一个方法或者属性和类或者对象关联起来,被称为绑定 。
- 静态绑定:在程序运行前写好的属性和方法。动态绑定:在程序运行后添加的属性和方法 )
实现接口
•json dump() load() dumps() loads()
•pickle dump() load() dumps() loads()
类的定义
类是对象的模板(描述),类是一类特殊的对象。
-
类定义完成后,就产生了一个类对象,绑定到了ClassName上了。
-
class MyClass: x = "abc" # 类属性 def foo(self): # 类属性foo,也是方法 return "My Class" print(MyClass.x) print(MyClass.foo) print(MyClass.__doc__) class Student(object): # __init__是一个特殊方法用于在创建对象时进行初始化操作 # 通过这个方法我们可以为学生对象绑定name和age两个属性 def __init__(self, name, age): self.name = name self.age = age def study(self, course_name): print(f'{self.name}正在学习{course_name}.') # PEP 8要求标识符的名字用全小写多个单词用下划线连接 # 但是部分程序员和公司更倾向于使用驼峰命名法(驼峰标识) def watch_movie(self): if self.age < 18: print(f'{self.name}只能观看《熊出没》.') else: print(f'{self.name}正在观看XXX电影.') def main(): # 创建学生对象并指定姓名和年龄 stu1 = Student('小明', 20) # 给对象发study消息 stu1.study('Python程序设计') # 给对象发watch_av消息 stu1.watch_movie() stu2 = Student('王', 15) stu2.study('思想品德') stu2.watch_movie() if __name__ == '__main__': main()
对象的属性和方法
-
self
在类中定义的方法必须有个额外的第一个参数,就是self,表示创建的类实例本身
属性就是在类中定义的变量 - 实例属性
- 从属于对象的属性也称实例变量
- 一般在__init__()中定义
- self.实例属性=初始化
- 调用
- 创建实例对象后
- obj = 类名()
- obj.实例属性=值
- 类内部 self.实例属性名
- 私有属性
- 实现"封装",隐藏数据,只能在类的内部调用
- 两个下滑线__开头的属性是私有属性(private),其他为公共属性(public).
- 不是特别严格,主要靠自觉
- 类属性特殊属性
五.魔术方法
- 属于类的属性,所有对象共享
- 定义
- 使用类名.类变量名来读写
-
-
- 创建函数__new__()用于创建对象,一般不需要我们自定义
- 构造函数__init__()对象的初始化,对象建立后,自动执行,初始化当前对象的相关属性,无返回值
- 析构函数__del__() 当类被销毁时,执行的操作。
- 回调函数__call__()表示对象可以和函数一样被调用.
- 对象描述__str__(),__repr__()
- # __new__() 方法是在类准备将自身实例化时调用;
-
def __new__(cls,*args,**kwargs):
return object.__new__(cls)
# 对象建立后,自动执行,初始化当前对象的相关属性,无返回值
def __init__(self,参数列表):
# 需要被初始化的属性或方法
pass
# 析构函数
def __del__(self):
pass
# 当类被销毁时,执行的操作
# 一般用来释放对象占用的资源
# 如打开的文件或链接的网络
# 一般不用自定义析构函数