python--类的约束,异常处理,MD5加密,日志处理logging模块
1.类的约束
在开发中,如果项目经理需要对类进行约束,可以有两种方式
1. 对子类进行约束
Base:
#对子类进行约束,必须重写这个方法
# 在工作中发现了NotImplementedError之后,继承并重写这个方法
def login(self):
raise NotImplementedError class Member(Base):
def login(self):
print("普通用户登陆") class BaWu(Base):
def login(self):
print("吧务登陆") class Houtai(Base):
def login(self):
print("后台登陆")
# 整合这些个功能
def deng(obj):
obj.login() m = Member()
bw = BaWu()
ht = Houtai() deng(m)
deng(bw)
deng(
2.采用抽象类和抽象方法来进行约束,这个方式来源与java与c#
1.抽象方法不需要给出具体的方法体.抽象方法内只写一个pass就可以了
2.在一个类中如果有一个方法是抽象方法,那么这个类一定是一个抽象类
3.抽象类中,如果有抽象方法.此时这个类不能被创建对象
4.如果一个类中所有的方法都是抽象方法.这个类可以被称为接口类
#写一个抽象方法:导入一个模块
from abc import ABCMeta, abstractmethod #此时抽象类不能被创建对象
class Animal(metaclass = ABCMeta): # 写完这里,就是一个抽象类
@abstractmethod # 抽象方法
def chi(self): # 吃应该只是一个抽象概念.没办法完美描述出来吃什么
pass #抽象类中可以有正常的方法
def dong(self):
print("动物会动")
#class Cat(Animal): # 如果没有被注释的时候, Cat里面也有一个抽象方法,这时是创建不了对象的
# pass
class Cat(Animal):
def chi(self):
print("猫喜欢吃鱼") a = Cat()
a.chi()
a.dong()
2. 异常处理.
举个例子:
print(1/0) # 报错 ZeroDivisionError: division by zero
0不能作除数,这时就会报错,系统就会抛出这个异常,如果没有人处理,错误就会继续下去传给用户
处理异常: 通过try...except ...来处理错误
try:
print(1 / 0)
except Exception:
print("出错了, 出现了ZeroDivisionError")
print("哈哈哈哈哈哈哈") # 可以正常运行.
下面是try..except..的一般写法,所有异常的根是Excepiton,所有的异常类都会默认继承Exception
try:
代码
except 异常类:
处理异常
except 异常类:
处理异常
except 异常类:
处理异常
else:
当程序不出错,执行这里
finally:
不管出不出错,都要执行
自己定义异常: 随便写一个类,这个类只要继承了Exception 这个类就是一个异常类,就可以作为raise对象
class 类(Exception):
pass
这里我们举一个例子,比如一个男浴池只能男人进
class GenderException(Exception):
pass class Person:
def __init__(self, name, gender):
self.name = name
self.gender = gender def xizao(self):
print(f"{self.name}在洗澡") def nan_zao_tang_zi(ren):
if ren.gender == "男":
ren.xizao()
else:
raise GenderException("性别不对. 去对门看看") # 抛异常是很重要的 try:
p1 = Person("小名", "未知")
p2 = Person("小亮", "男") nan_zao_tang_zi(p1)
nan_zao_tang_zi(p2)
except GenderException:
# ret = traceback.format_exc() # 这里可以查看堆栈信息, 看错误的
# print(ret)
print("出错了. 很可惜") # 错误信息叫堆栈信息
3.MD5加密
总结的用法
import hashlib obj = hashlib.md5(b'盐')
obj.update(b"要加密的内容")
print(obj.hexdigest())
在用户登陆设计时,有时不希望一些维护人员等能够直接看到登陆名和密码,这是我们可以采用MD5来加密内容,而且这种加密是不可逆的
使用这个功能需要引入一个hashlib模块
import hashlib
obj = hashlib.md5()
obj.update("yonghuming".encode()) # 加密必须是字节
miwen = obj.hexdigest()
print(miwen) # c1e396b02e499cf86298b6c486d43db7
这样的加密其实并不安全.当我们用这样的密文去CMD5网站撞库查询时,是有很大几率能解密成功的
为了解决这个问题,在使用MD5的时候,给函数的参数传递一个byte即可
import hashlib
obj = hashlib.md5(b"alaieur") # 这里的功能是 加盐
obj.update("yonghuming".encode()) # 加密必须是字节
miwen = obj.hexdigest()
print(miwen) # b9143a2edaf392b18a8650853290ef7a
这样就无法解密了
举个MD5的应用例子
# 我自己的MD5功能
def my_md5(s):
obj = hashlib.md5(b"fkldsajlkfjlaksdjfkladsjfkladsjkldsjfklfjs") # 加盐
obj.update(s.encode("utf-8")) # 把要加密的内容给md5
return obj.hexdigest()
#应用
username = "wusir"
password = "3e29aa0dc8a38b43c3479566cafc3cbe" # 登录
uname = input("请输入你的用户名")
upwd = input("请输入你的密码") # 123456
if uname == username and my_md5(upwd) == password:
print("登录成功")
else:
print("登录失败")
4.日志处理
编写软件时,多少都会出现一些bug.这些问题或者bug一般都会在测试的时候给处理掉,但是多少都会出现一些意想不到的错误,这个时候,我们不知道哪里出了问题,因为很多Bug不是必现的,所以我们需要在python中创建一套日志系统,来帮助我们更好的发现错误来源
处理的流程是这样:
1.导入logging模块
2.简单配置一下logging
3.出现异常的时候(except).向日志里写错误信息.
这是第一种日志处理方式
import logging filename: 文件名
format: 数据的格式化输出. 最终在日志文件中的样子
时间-名称-级别-模块
datefmt: 时间的格式
level: 错误的级别权重,当错误的级别权重大于等于leval的时候才会写入文件 # 配置好日志的处理, 默认就是GBK
logging.basicConfig(filename='x1.txt', # 把日志信息写入的文件名
format='%(asctime)s - %(name)s - %(levelname)s -(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', # 时间的格式
level=40) # 当前配置表示 10以上的分数会被写入日件 #日志处理级别
critical = 50
fatal = critical
error = 40
warn = warning
warning = 30
info = 20
debug = 10
notset = 0 # 向日志文件写入内容
logging.critical("最高级50") # 50, 几乎是最高的
logging.error("错误等级40") # 40 平时使用最多的就是他
logging.warn("警告级别30") # 30 警告
logging.warning("还好吧")
logging.info("提示20") # 20 级
logging.debug("开发的时候把这个开着,级别为10") #
logging.log(999, "最低级为0")
最后, 如果你系统中想要把日志文件分开. 比如. 一个大项目, 有两个子系统, 那两个子系统要分开记录日志. 方便调试. 那怎么办
呢? 注意. 用上面的basicConfig是搞不定的.
要借助文件助手(FileHandler), 来帮我们完成日志的分开记录. 我们来看看第二种处理日志的方式,用来记录到不同的日志文件
import logging #创建一个操作日志的对象logger(以来FileHandler)
file_handler = logging.FileHandler("l1.log","a",encoding="utf-8") # 创建文件
file_handler.setFormatter(logging.Formatter(
fmt = "%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(message)s")) # 设置日志文件的格式
logger1 = logging.Logger("腾讯qq",level = 10) # 创建一个日志文件处理对象
logger1.addHandler(file_handler) # 把文件添加到日志 logger1.error(file_handler)
logger1.error("这里是内容") #再创建一个操作日志的对象logger(依赖FileHandler)
file_handler2 = logging.FileHandler("l2.log","a",encoding="utf-8")
file_handler2.setFormatter(logging.Formatter(
fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s"))
logger2 = logging.Logger("这里",level=logging.DEBUG)
logger2.addHandler(file_handler2) logger2.error("我才不去呢,离你那么远")
举个应用这个的例子:
import logging #创建一个操作日志的对象logger(依赖FileHandler)
file_handler = logging.FileHandler("l1.log","a",encoding="utf-8") # 创建文件
file_handler.setFormatter(logging.Formatter(
fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s")) # 设置日志文件的格式
logger1 = logging.Logger("腾讯qq",level = 10) # 创建一个日志文件处理对象
logger1.addHandler(file_handler) # 把文件添加到日志
logger1.error(file_handler)
logger1.error("这里是内容") #再创建一个操作日志的对象logger(依赖FileHandler)
file_handler2 = logging.FileHandler("l2.log","a",encoding="utf-8")
file_handler2.setFormatter(logging.Formatter(
fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s"))
logger2 = logging.Logger("这里",level=logging.DEBUG)
logger2.addHandler(file_handler2) logger2.error("我才不去呢,离你那么远")
import traceback
class GenderException(Exception):
pass class Person:
def __init__(self,name,gender):
self.name = name
self.gender = gender
logger1.info(f"这个人的名字是{self.name},这个人的性别是:{self.gender}") def xizao(self):
print(f"{self.name}在洗澡") class ZaoTang:
def nan(self,ren):
if ren.gender == "男":
ren.xizao()
else:
raise GenderException("我这里要的是男人")
try:
p1 = Person("小名","男")
p2 = Person("小红","女")
zaotang = ZaoTang()
zaotang.nan(p2) except GenderException:
print("走错屋里了")
logger1.error("走错屋了")
logger1.error(traceback.format_exc()) # 把堆栈信息记录在日志文件中
python--类的约束,异常处理,MD5加密,日志处理logging模块的更多相关文章
- python之路--类的约束, 异常处理, MD5, 日志处理
一 . 类的约束 1. 写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束. 必须重写该方法 # 以后上班了. 拿到公司代 ...
- python 面向对象(五)约束 异常处理 MD5 日志处理
###############################总结###################### 1.异常处理 raise:抛出异常 try: 可能出现错误代码 execpt 异常类 a ...
- Python面向对象(约束,异常处理,md5加密)(五)
1. 类的约束 1. 写一个父类. 父类中的某个方法要抛出一个异常 NotImplementedError class Base: def login(self): raise NotImplemen ...
- 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理
一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...
- 小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理)
小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理) 异常处理(处理) 1.产生异常.raise 异常类(),抛出异常2. 处理异常: try: xxxxx # 尝试执行的代码. ...
- MD5工具类,提供字符串MD5加密、文件MD5值获取(校验)功能
MD5工具类,提供字符串MD5加密(校验).文件MD5值获取(校验)功能 : package com.yzu.utils; import java.io.File; import java.io.Fi ...
- Python日志输出——logging模块
Python日志输出——logging模块 标签: loggingpythonimportmodulelog4j 2012-03-06 00:18 31605人阅读 评论(8) 收藏 举报 分类: P ...
- Python之日志处理 logging模块
Python之日志处理(logging模块) 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四 ...
- python --- 20 约束 异常处理 MD5 日志
一.类的约束 1.抛出异常 NotImplementedError 2.抽象方法 含有抽象方法的类是抽象类 抽象类中的方法全是抽象方法的是接口 抽象类不能创建对象 二.异常处理 处理完后代码可继 ...
随机推荐
- Spring配置项<context:annotation-config/>解释说明
转自:https://blog.csdn.net/techbirds_bao/article/details/9241371 在基于主机方式配置Spring的配置文件中,你可能会见到<conte ...
- 将bmp文件转换为jpg文件
procedure TForm1.Button1Click(Sender: TObject);(*压缩MBP为JPEG;但是没有提供压缩比可选项凑合用吧,大概1/3 ^_^:Note:必须加上JPEG ...
- 取出资源文件中的bitmap,并将其保存到TMemoryStream中,从资源里载入图象而不丢失调色板
从资源里载入图象而不丢失调色板 procedure loadgraphic(naam:string);var { I've moved these in here, so they exist on ...
- tfrecord
制作自己的TFRecord数据集,读取,显示及代码详解 http://blog.csdn.net/miaomiaoyuan/article/details/56865361
- Python运维开发基础03-语法基础
上节作业回顾(讲解+温习60分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen #只用变量和字符串+循环实现" ...
- 图片放大镜——jQuery插件Cloud Zoom
下载地址:cloud_zoom.rar 图片放大镜效果是一种不错的效果,多应用于电子商务.图片展示等网站,给用户带来更好的体验.实现这种效果的代码不少,今天要给大家介绍的是 Cloud Zoom,它是 ...
- 将Oracle数据库设置为归档模式及非归档模式
一.将Oracle数据库设置为归档模式 1)sql>shutdown normal/immediate;2)sql>startup mount;3)sql>alter databas ...
- Linux mmap函数简介
一.简介 Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'easylabdb.userInfo' doesn't exist
这个问题主要是说,你查找的表不存在,但是,事实上我这个表示存在的,会产生这个问题的原因是,我这个表的大小写拼写方式跟sql语句中的大小写不一样,这时就要设置数据库不区分大小写 找到mysql的配置文件 ...
- 虚拟机CentOS6.5搭建samba服务器实现文件共享
Samba是SMB的一种实现方法,主要用来实现Linux系统的文件和打印服务.Linux用户通过配置使用Samba服务器可以实现与Windows用户的资源共享:而守护进程smbd和nmbd是Samba ...