day27---面向对象模块

1. 包

  • 导入包的方式:

    • 第一种方式(直接导入):import 包名.目录名.目录名n.模块名(中间所有的目录级别都使用.来连接,最后一个名字一定是模块名);使用时把import后面的所有当作一个整体来使用
    import project.v1.core.main
    
    • 第二种方式(直接导入):from 包名.目录名.目录名n import 模块名;使用时直接用模块名就可以
    from project.v1.core import main
    
    • 第三种方式:绝对路径导入
      • 所有模块的导入从根目录开始
      • 根目录发生变化,包内的模块和代码也会发生变化
      • 在包内的代码调用时不会报错
      • 根目录节点的位置是由sys.path中的路径决定
      • 如果希望所有的程序都能正常运行,需要修改sys.path中的内容
    • 第四种方式:相对路径导入
      • 不用考虑当前目录的模块位置
      • 根节点发生变化,包内的模块位置不受影响
      • 在包内不能直接执行,不然会报错
      • 只能在包外调用,不用关心内部模块的导入问题
    • 第五种方式:使用*和__all__结合,利用from ... import *和__all__的相关配置来产生一种包定制
  • 包导入的常用模版:

    import os
    import sys
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    print(sys.path)
    from core import main
    if __name__ == '__main__':
        main.starting()
    

2. hashlib模块

  • 说明:摘要算法模块

  • 分类:md5、sha1、sha256、sha512

  • 过程:不可逆

  • 应用:

    • 检测文件的一致性
    • 用户加密验证
  • 加密:最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示;SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示,比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长

    • 单纯的加密方式不够安全
    • 加盐处理
    • 动态加盐
# md5加密方式
import hashlib
# 普通方式
yy_md5 = hashlib.md5()
yy_md5.update('liyanloveyaya'.encode('utf-8'))
print(yy_md5.hexdigest())
# 数据量大时,多次调用update(),最后计算的结果是一样的
yan_md5 = hashlib.md5()
yan_md5.update('liyan'.encode('utf-8'))
yan_md5.update('love'.encode('utf-8'))
yan_md5.update('yaya'.encode('utf-8'))
print(yan_md5.hexdigest())
# 加盐方式
salt = 'salt'.encode('utf-8')
yy1 = hashlib.md5()
yy1.update(salt)
yy1.update('yy1'.encode('utf-8'))
print(yy1.hexdigest())
yy2 = hashlib.md5()
yy2.update(salt)
yy2.update('yy2'.encode('utf-8'))
print(yy2.hexdigest())
# 1. 加盐可以使用复杂性的加密方式,最好用大小写字母、数字和特殊符号的组合使用
# 2. 可以使用动态加盐的方式进行加密
>>>
d0fd8c4c2c0d6af33bbed2425d275a5f
d0fd8c4c2c0d6af33bbed2425d275a5f
808c9cb52f0a9d6cc3ad8c5d8a57217e
c90db841561b773553232b6ec7576e23d
# sha1加密方式
import hashlib
yy_sha1 = hashlib.sha1()
yy_sha1.update('liyanloveyaya'.encode('utf-8'))
print(yy_sha1.hexdigest())
yan_sha1 = hashlib.sha1()
yan_sha1.update('liyan'.encode('utf-8'))
yan_sha1.update('love'.encode('utf-8'))
yan_sha1.update('yaya'.encode('utf-8'))
print(yan_sha1.hexdigest())
salt = 'salt'.encode('utf-8')
yy1 = hashlib.sha1()
yy1.update(salt)
yy1.update('yy1'.encode('utf-8'))
print(yy1.hexdigest())
yy2 = hashlib.sha1()
yy2.update(salt)
yy2.update('yy2'.encode('utf-8'))
print(yy2.hexdigest())
>>>
cb15dcc3b29d8a38779f1968aa294790ae13729c
cb15dcc3b29d8a38779f1968aa294790ae13729c
063737cfa77f3e8fe7d530646302a09738f64db4
55238a894d69ad3ae13a4dc0bb671ab7bc51df58

3. configparse模块

  • 说明:配置文件模块

  • 作用:专门为解决一种样式的配置文件而产生的

# 初始化配置文件
import configparser
yy_config = configparser.ConfigParser()
# 实例化配置文件
yy_config['DEFAULT'] = {
    'default': 'config'
}
# DEFAULT组是默认组,可有可无
yy_config['conf'] = {
    'ip': '10.0.0.1',
    'port': '3306',
    'username': 'yy',
    'password': '123456',
    'db_name': 'yy_db'
}
with open('config.ini', 'w', encoding='utf-8') as f:
    yy_config.write(f)
>>>'config.ini文件内容' 
[DEFAULT]
default = config
[conf]
ip = 10.0.0.1
port = 3306
username = yy
password = 123456
db_name = yy_db
# 文件的查看操作(接上面代码)
yy_config.read('config.ini')
# 读取配置文件信息
print(yy_config['conf']['ip'])
# 查看组内一个键的值
print(yy_config.get('conf', 'db_name'))
# 查看组内一个键的值
print(yy_config.options('conf'))
# 查看组中所有的键,以列表的形式返回,也包括了默认组中的键
print(yy_config.items('conf'))
# 查看组中所有的键值对,键值对使用元组存储,每一对分别放在列表中返回,也包括了默认组中的键值对
>>>
10.0.0.1
yy_db
['ip', 'port', 'username', 'password', 'db_name', 'default']
[('default', 'config'), ('ip', '10.0.0.1'), ('port', '3306'), ('username', 'yy'), ('password', '123456'), ('db_name', 'yy_db')]
# 文件的增加操作(接上面代码)
yy_config.add_section('redis_config')
# 增加组
yy_config['conf']['db_engine'] = 'InnoDB'
yy_config['conf']['db_prefix'] = 'yy_'
yy_config['redis_config']['ip'] = '10.0.0.2'
yy_config['redis_config']['port'] = '6379'
yy_config['redis_config']['auth'] = 'redis_password'
# 增加组内的配置
yy_config.write(open('config.ini', 'w'))
# 文件操作增加完默认保存在内存中,需要使用写文件的操作保存操作结果
>>>'config.ini文件内容'
[DEFAULT]
default = config
[conf]
ip = 10.0.0.1
port = 3306
username = yy
password = 123456
db_name = yy_db
db_engine = InnoDB
db_prefix = yy_
[redis_config]
ip = 10.0.0.2
port = 6379
auth = redis_password
# 文件的修改操作(接上面代码)
yy_config.set('redis_config', 'auth', 'REDIS_Passw0rd')
# 修改组内键对应的值
yy_config.write(open('config.ini', 'w'))
>>>'config.ini文件内容'
[DEFAULT]
default = config
[conf]
ip = 10.0.0.1
port = 3306
username = yy
password = 123456
db_name = yy_db
db_engine = InnoDB
db_prefix = yy_
[redis_config]
ip = 10.0.0.2
port = 6379
auth = REDIS_Passw0rd
# 文件的删除操作(接上面代码)
yy_config.remove_section('redis_config')
# 删除整个组
yy_config.remove_option('conf', 'db_prefix')
# 删除组内指定的键值对
yy_config.write(open('config.ini', 'w'))
>>>'config.ini文件内容'
[DEFAULT]
default = config
[conf]
ip = 10.0.0.1
port = 3306
username = yy
password = 123456
db_name = yy_db
db_engine = InnoDB

4. logging模块

  • 说明:日志模块

  • 日志的描述:把程序运行的过程输出到屏幕或文件中记录,叫日志

  • 日志级别(顺序是从上到下一级比一级严格):

    • logging.debug (调试模式)
    • logging.info (信息模式)
    • logging.warning (警告模式)
    • logging.error (错误模式)
    • logging.critical (批判模式)
  • 设置日志级别:

    • 默认设置全局输出的日志级别为debug模式:logger.setLevel(logging.Debug)
    • 设置单个文件流或屏幕流的日志级别位debug模式:句柄名称.setLevel(logging.Debug)
  • 简单模式:

    • 配置简单,直接可以使用
    • 无法同时输出多个地方
import logging
logging.basicConfig(
    level=logging.INFO,
    # 日志级别
    format='[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]',
    # 日志输出格式(时间格式化、程序文件名、程序在文件中的行数、日至级别、日志描述信息)
    datefmt='%Y-%m-%d %H:%M:%S',
    # 日志的时间格式
    filename='logging.log',
    # 输出存储日志的文件名
    filemode='a',
    # 日志文件的打开模式
)
logging.debug('debug_message...')
logging.info('info_message...')
logging.warning('warning_message...')
logging.error('error_message...')
logging.critical('critical_message...')
>>>'logging.log文件内容'
[2017-11-23 16:42:55] [yan27.py] [line:57] [INFO] [info_message...]
[2017-11-23 16:42:55] [yan27.py] [line:58] [WARNING] [warning_message...]
[2017-11-23 16:42:55] [yan27.py] [line:59] [ERROR] [error_message...]
[2017-11-23 16:42:55] [yan27.py] [line:60] [CRITICAL] [critical_message...]
  • logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,常用的参数有:

    • level:设置日志级别
    • format:设置日志显示格式
    • datefmt:设置日期时间格式
    • filename:指定日志输出的文件名,不指定输出到终端
    • filemode:指定日志文件的打开模式
    • stream:指定输出终端(默认的输出方式),如果指定了filename,则stream不生效
  • 日志显示格式的格式化串:
    • %(name)s Logger的名字
    • %(levelno)s 数字形式的日志级别
    • %(levelname)s 文本形式的日志级别
    • %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
    • %(filename)s 调用日志输出函数的模块的文件名
    • %(module)s 调用日志输出函数的模块名
    • %(funcName)s 调用日志输出函数的函数名
    • %(lineno)d 调用日志输出函数的语句所在的代码行
    • %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
    • %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
    • %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    • %(thread)d 线程ID。可能没有
    • %(threadName)s 线程名。可能没有
    • %(process)d 进程ID。可能没有
    • %(message)s用户输出的消息
  • 高级模式

    • 支持同时输出到多个地方
    • 可以配置多地存储方式
import logging
yy_Logger = logging.getLogger()
yy_Logger.setLevel(logging.INFO)
# 设置日志级别
# 实例化对象
f1 = logging.FileHandler('logging1.log', encoding='utf-8')
# 创建文件句柄
format1 = logging.Formatter('[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]')
# 指定日志输出格式
f1.setFormatter(format1)
# 关联文件句柄和日至格式
yy_Logger.addHandler(f1)
# 添加文件句柄到对象中
f2 = logging.FileHandler('logging2.log', encoding='utf-8')
format2 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
f2.setFormatter(format2)
yy_Logger.addHandler(f2)
s1 = logging.StreamHandler()
# 创建屏幕流对象
stream_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
s1.setFormatter(stream_format)
yy_Logger.addHandler(s1)
logging.debug('debug_message...')
logging.info('info_message...')
logging.warning('warning_message...')
logging.error('error_message...')
logging.critical('critical_message...')
>>>'终端输出内容'
2017-11-23 17:04:48,471 - root - INFO - info_message...
2017-11-23 17:04:48,471 - root - WARNING - warning_message...
2017-11-23 17:04:48,471 - root - ERROR - error_message...
2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
>>>'logging1.log文件内容'
[2017-11-23 17:04:48,471] [yan27.py] [line:90] [INFO] [info_message...]
[2017-11-23 17:04:48,471] [yan27.py] [line:91] [WARNING] [warning_message...]
[2017-11-23 17:04:48,471] [yan27.py] [line:92] [ERROR] [error_message...]
[2017-11-23 17:04:48,471] [yan27.py] [line:93] [CRITICAL] [critical_message...]
>>>'logging2.log文件内容'
2017-11-23 17:04:48,471 - root - INFO - info_message...
2017-11-23 17:04:48,471 - root - WARNING - warning_message...
2017-11-23 17:04:48,471 - root - ERROR - error_message...
2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
  • 组件:

    • Logger:提供应用程序可直接使用的接口
    • Handler:指定日志输出的目的地
    • Filter:提供过滤日志信息的方法
    • Formatter:指定日志显示格式
posted @ 2017-11-23 18:19  _岩哥  阅读(183)  评论(0)    收藏  举报