约束

约束 , 约束其派生类:  保证派生类中必须编写send方法 , 不然执行可能就会报错

Python中  语法:

 class BaseMessage(object):
def send(self):
""""
必须继承BaseMessage,然后其中必须编写send方法, 用于完成具体业务
"""
raise NotImplementedError(".send()必须被重新写")
# raise Exception (".send(), 必须被重新写") 这种不专业 , 没有研究过低层, 及Javaa class Email(BaseMessage):
def send(self,x1):
"""
必须继承BaseMessage,然后其中必须编写send方法。用于完成具体业务逻辑。
"""
pass obj = Email()
obj.send(1)

Python中约束的方式 :

有主动抛异常 (如上)    还有   抽象类和抽象方法:

总结 :

  • 什么是接口以及作用?

    •   接口是一种数据类型,主要用于约束派生类中必须实现指定的方法
    •   Python中不存在, Java和C#中存在
  • Python中使用过什么来约束?
    •   抽象类 + 抽象方法  ,  编写上麻烦, 不常用
    •  人为主动抛异常
  • 约束时 ,  抛异常是否可以用其他的?
    •   专业 : raise  NotImplementedError(".send()  必须被重写")
    • 不专业: raise  Exception(".send()  必须被重写")

应用场景 :

  多个类 , 内部都必须有某些方法时 , 需要使用基类 + 异常进行约束

自定义异常

解释:

  上面定义已知异常类 ,   继承  Exception   类 , 下面接收该设置的已知异常类, 并可以设置返回结果 , 最后写一个接收未知异常  (Exception)  

例如 :

 # 自定义异常
import os class ExistsError(Exception):
pass class KeyInvalidError(Exception):
pass def func(path,prev):
"""
去path路径的文件中,找到前缀为prev的一行数据,获取数据并返回给调用者。
1000, 成功
1001, 文件不存在
1002, 关键字为空
1003, 未知错误
... :return:
"""
response = {"code":1000,"data":None}
try:
if not os.path.exists(path): # 判断路径是否存在
raise ExistsError()
if not prev:
raise KeyInvalidError() """
代码块
"""
except ExistsError as e:
response['code'] = 1001
response['data'] = '文件不存在'
except KeyInvalidError as e:
response['code'] = 1002
response['data'] = '关键字为空'
except Exception as e:
response['code'] = 1003
response['data'] = '未知异常'
return response
print(func("E:\Python",""))

自定义异常例子

加密

引用 import  hashlib  模块   可以将字符串加密成密文

用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

一般用加密密码  防止数据库被盗 ,密码泄露   此加密无法解密

 import hashlib

 heshun = b"hehsun123456"  # 自定义添加的特有的加密

 def md5(pwd):
# 初始化对象
obj = hashlib.md5(heshun)
# 写入加密字节
obj.update(pwd.encode("utf-8"))
# 获取密文
return obj.hexdigest()

用于密码加密

例如:

 import hashlib

 SALT = b'heshun123456'

 def md5(pwd):
# 实例化对象
obj = hashlib.md5(SALT)
# 写入要加密的字节
obj.update(pwd.encode('utf-8'))
# 获取密文
return obj.hexdigest() user = input("请输入用户名:")
pwd = input("请输入密码:")
if user == 'qq123456' and md5(pwd) == '94394d9d8f30ed2dd8259819c60b9c54':
print('登录成功')
else:
print('登录失败')

日志

引用  logging   模块

用于便捷记录日志且线程安全的模块

1 , 单文件日志

import logging

logging.basicConfig(filename="rizhi.txt",
   format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=10) logging.debug("日志显示")
logging.info("日志显示")
logging.warning("日志显示")
logging.error("日志显示")
logging.critical("日志显示") logging.log(10,"log")
filename = "路径"
format = "时间" - "用户" - "级别名称"-"路径"- "消息提示"
datefmt = '%Y-%m-%d %H:%M:%S %p' #格式化时间
level = " 等级" 报错等级多少以上才显示

日志等级

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

注  :  只有[当前写等级] 大于等于[日志等级] 时 ,日志文件才被记录

日志记录格式:

多文件处理日志

对于上述记录日志的功能,只能将日志记录在单文件中,如果想要设置多个日志文件, logging.basicConfig 将无法完成, 需要自定义和日志操作对象.

# 定义文件
file_1_1 = logging.FileHandler('l1_1.log', 'a', encoding='utf-8')
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
file_1_1.setFormatter(fmt) file_1_2 = logging.FileHandler('l1_2.log', 'a', encoding='utf-8')
fmt = logging.Formatter()
file_1_2.setFormatter(fmt) # 定义日志
logger1 = logging.Logger('s1', level=logging.ERROR)
logger1.addHandler(file_1_1)
logger1.addHandler(file_1_2) # 写日志
logger1.critical('')

日志一

 # 定义文件
file_2_1 = logging.FileHandler('l2_1.log', 'a')
fmt = logging.Formatter()
file_2_1.setFormatter(fmt) # 定义日志
logger2 = logging.Logger('s2', level=logging.INFO)
logger2.addHandler(file_2_1)

日志二

如上述创建的两个日志对象

  • 当使用[logger1] 写日志时,会将相应的内容写入 l1_1.log 和 l1_2.log 文件中
  • 当使用【logger2】写日志时,会将相应的内容写入 l2_1.log 文件中

将错误信息完全写入日志中

引用   traceback   模块

 import logging
import traceback logging.basicConfig(filename="rizhi.txt",
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=10) def func():
try:
a = a +1
except Exception as e:
# 获取当前错误的堆栈信息
msg = traceback.format_exc()
logging.error(msg)
func()

如何获取异常的堆栈信息

import trance
try:
       …
except Exception as e:
         trance.format_exc()

Python 约束 , 自定义异常 , 加密 , 日志的更多相关文章

  1. 小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理)

    小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理) 异常处理(处理) 1.产生异常.raise 异常类(),抛出异常2. 处理异常: try: xxxxx # 尝试执行的代码. ...

  2. python约束 异常 MD5 日志处理

    一.约束 1.用父类执行约束 子类继承父类,用重写方法,对子类的方法进行约束. class Foo: def login(self): # 对子类进行约束,该方法需要重写 # 没有执行的错误 rais ...

  3. 异常处理,约束,MD5加密日志处理

    程序运行过程中产生的错误, 不正常 def chufa(a, b): try: # 尝试执行xxx代码 ret = a/b # 如果这里出现了错误. 异常. 系统内部会产生一个异常对象. 系统会把这个 ...

  4. python 约束. 异常处理. MD5. 日志处理

    一.约束 1.抛异常 # # 项目经理写的 class Base: # # 对子类进行了约束. 必须重写该方法 # # 以后上班了. 拿到公司代码之后. 发现了NotImplementedError ...

  5. 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理

    一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...

  6. python爬虫---js加密和混淆,scrapy框架的使用.

    python爬虫---js加密和混淆,scrapy框架的使用. 一丶js加密和js混淆 js加密 ​ 对js源码进行加密,从而保护js代码不被黑客窃取.(一般加密和解密的方法都在前端) http:// ...

  7. Python的RSA加密和PBE加密

    最近在写接口的时候,遇到了需要使用RSA加密和PBE加密的情况,对方公司提供的DEMO都是JAVA的,我需要用python来实现. 在网上搜了一下,python的RSA加密这块写的还是比较多的,但是P ...

  8. python中的第三方日志模块logging

    基本上每个系统都有自己的日志系统,可以使自己写的,也可以是第三方的.下面来简单介绍一下python中第三方的日志模块,入手还是比较简单的,但是也很容易给自己埋雷. 下面是我参考的资料链接 入手demo ...

  9. 潭州课堂25班:Ph201805201 爬虫基础 第七课 Python与常见加密方式 (课堂笔记)

    打开图形界面  18版 Python与常见加密方式 前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时 ...

随机推荐

  1. 为什么这个地方用重定向会报错.只能用 服务器跳转?? 为什么我加了过滤器,还是能直接登陆 servlet

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...

  2. WeChat on Web 部分功能模拟实现

    Flask from flask import Flask,request,render_template,session,jsonify import time import requests im ...

  3. Android event logcat的研究

    经常有这样的需求:在程序A启动之后,在这个程序上覆盖一个界面,让用户输入密码后才能启动程序A,这类场景主要集中在安全软件中. 那应该怎样得知某某程序启动了,系统没有相应的广播,这很难知道程序启动了. ...

  4. MySQL 进入 导入

    命令行进入时 不能用 ‘;’ 结尾

  5. python 中出现 “IndentationError: expected an indented block” 问题

    python 学习 在定义Python函数的时候如下 >>>def hello() . . .print "hello" 这样会报错的,报错如下: Indenta ...

  6. Hadoop集群中节点角色定义

    Hadoop分别从两个角度将主机划分为两种角色. 最基本的划分原则为Master和Slave,即主人和奴隶: 第一,从HDFS的角度,将主机划分为NameNode和DataNode(在分布式文件系统中 ...

  7. 迁移 Windows 上 Oracle 11.2.0.3.0 到 Linux 上 Oracle 11.2.0.3.0

    一.迁移前数据库基本信息统计 查看数据库版本 SELECT * FROM V$VERSION; /* Oracle Database 11g Enterprise Edition Release 11 ...

  8. HihoCoder1622 : 有趣的子区间(预处理+组合数)

    有趣的子区间 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个区间[a, b]内恰好包含偶数个回文整数,我们就称[a, b]是有趣的区间. 例如[9, 12]包含 ...

  9. bzoj 1226 学校食堂Dining

    Written with StackEdit. Description 小\(F\) 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜 ...

  10. self = [super init] 最终解释

    答:      init 中调用super的 init方法来初始化自己所包含有的父类信息 1.内存分配      内存应该在[Class alloc]的时候就已经分配了,大小和类型应该由对应的Clas ...