python学习笔记:第19天 类的约束、异常、MD5和logging

目录

  • 一、类的约束
  • 二、异常处理:
  • 三、MD5加密
  • 四、日志(logging模块)

一、类的约束

真正写写项目的代码时都是多人协作的,所以有些地方需要约束程序的结构。也就是说,在分配任务之前就应该把功能定义好,然后分别交给底下的程序员来完成相应的功能。

在python中有两种办法来约束类的方法:

  • 第一种方法使用继承的特性:提取⽗类,然后在⽗类中定义好⽅法,在这个⽅法中什么都不⽤⼲,就抛⼀个异常就可以了。这样所有的⼦类都必须重写这个⽅法,否则访问的时候就会报错。
class Base:def run(self):raise NotImplementedError('子类没有实现login方法')class Foo1(Base):def run(self):print('Foo1\'s Function')class Foo2(Base):def run(self):print('Foo2\'s Function')class Foo3(Base):def run3(self):                         # Foo3中没有按规范重写run方法,这里会报错print('Foo3\'s Function')l1 = [Foo1(), Foo2(), Foo3()]
for item in l1:item.run()

结果如下:

1513667-20181112195150909-1267693648.png

  • 第二种方法是使⽤元类来描述⽗类:在元类中给出⼀个抽象⽅法,这样⼦类就不得不给出抽象⽅法的具体实现,也可以起到约束的效果。
from abc import ABCMeta, abstractmethod                 # 导入抽象元类和定义抽象方法的装饰器class Aminal(metaclass=ABCMeta):                        # 在创建类的时候指定要使用ABCMeta元类@abstractmethoddef eat(self):                                      # 然后定义了一个抽象方法passclass Cat(Aminal):passc = Cat()
c.eat()

1513667-20181112201843839-680920046.png

上面的结果告诉我们,必须要实现抽象类才能实例化这个对象,手动重写这个方法后就能正常使用了:

from abc import ABCMeta, abstractmethodclass Aminal(metaclass=ABCMeta):@abstractmethoddef eat(self):passclass Cat(Aminal):def eat(self):print('猫抓老鼠')c = Cat()
c.eat()# 结果:
# 猫抓老鼠

总结: 约束. 其实就是⽗类对⼦类进⾏约束. ⼦类必须要写xxx⽅法. 在python中约束的⽅式和⽅法有两种:

  • 使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#. 所以使⽤频率还是很少的
  • 使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐)

二、异常处理:

异常:所谓异常就是程序在运行过程中出现的异常,这种是事先不能预知的,只有在程序运行时才会出现,所以我们要编写异常处理的程序来应对。

try:坑能抛出异常的语句except 异常1:捕获异常1时处理的步骤except 异常2:捕获异常2时处理的步骤finally:try语句块最后执行的操作

解读:程序先执⾏操作, 然后如果出错了会走except中的代码,如果不出错, 执⾏else中的代码。不论处不出错,最后都要执⾏finally中的语句,⼀般⽤try...except就够⽤了,顶多加上finally,finally⼀般⽤来作为收尾⼯作

我们先来看个异常的例子:

# 计算a+bdef cal(a, b):try:return a + bexcept TypeError as v:                      # 捕获到TypeError异常时执行这段代码块的处理步骤print('输入正确的数字(整数或者小数)')cal(10, '胡辣汤')# 这个时候会执行自定义的处理方法
# 输入正确的数字(整数或者小数)

上面我们捕获到异常都是python自定义的异常(TypeErrorExcept等),在一些特定的场景中可能python内置的异常种类不能全部适用,所以我们需要抛出自定义的异常。那么自定义的异常要怎么写?⾃定义异常: 非常简单,只要你的类继承了Exception类,那你的类就是⼀个异常类,就这么简单。

class MyException(Exception):                   # 类继承了Exception类,这个类就是⼀个异常类了passdef cal(a, b):if ((type(a) == int) or type(a) == float) and ((type(b) == int) or type(b) == float):return a + belse:raise MyException('输入正确的数字(整数或者小数)')         #  当判断条件为假时我们手动抛出这个自定义异常try:cal(10, '胡辣汤')
except MyException as m:                        # 然后这里捕获异常print('捕捉到自定义的异常')                     # 捕获到异常后执行具体的处理步骤except Exception as e:                          # Exception可以放在最后面,可以捕获所有异常print('出错了')
finally:print('计算完成')                           # 最后finally语句结尾# 执行结果:
# 捕捉到自定义的异常
# 计算完成

这里再介绍一个知识点:查看具体的错误信息,当我们真正在调试的时候,最好是能看到错误源⾃于哪⾥,怎么办呢?需要引入另⼀个模块traceback这个模块可以获到我们每个⽅法的调⽤信息,⼜被成为堆栈信息,这个信息对我们拍错是很有帮助的,使用方法如下:

import traceback
def cal(a, b):try:return a + bexcept TypeError as v:print(traceback.format_exc())           # 这里可以把错误的堆栈信息打印出来,可以方便调试cal(10, '胡辣汤')

1513667-20181112195923850-250697189.png

三、MD5加密

MD5消息摘要算法(MD5 Message-Digest Algorithm)是⼀种不可逆的加密算法,它是可靠的,并且安全的(关于MD5加密这一块这里不多做介绍,后面会另外写博客介绍加密/解密这一块的)。在python中我们不需要⼿写这⼀套算法,只需要引入⼀个叫hashlib的模块就能搞定MD5的加密⼯作:

import hashlibobj = hashlib.md5()                 # 返回一额hash对象
obj.update("alex".encode("utf-8")) # 加密的必须是字节
miwen = obj.hexdigest()
print(miwen)                       # 534b44a19bf18d20b71ecc4eb77c572f

这样加密一串字符真的安全吗,我们在网上有很多在线解密MD5的工具,这个这个字符串放到那些网站上一解密就出来了,如下图:

1513667-20181112200047576-416832599.png

那么这是为什么呢,这是因为MD5存在的历史悠久,很多字符已经被加密记录到一个库中了,这种所谓的解密就是再这个库中查找记录,如果找到了就成为解密成功,那我们应该怎么避免这种问题呢,其实很简单,我们在生成hash对象时加点盐(salt)就OK了:

import hashlibobj = hashlib.md5(b'sjfqwjbekwjbckwo23o920fl2')
obj.update("alex".encode("utf-8"))
miwen = obj.hexdigest()
print(miwen)                        # 19c7d5410eda9452205f6b59e8ba2c33  # 这时候在拿去解密他就解密不了了

四、日志(logging模块)

logging模块的使用方法:

  • 导入logging模块
  • 简单配置⼀下logging
  • 出现异常的时候(except). 向⽇志⾥写错误信息.

logging模块的简单使用:

# filename: ⽂件名
# format: 数据的格式化输出. 最终在⽇志⽂件中的样⼦
# 时间-名称-级别-模块: 错误信息
# datefmt: 时间的格式
# level: 错误的级别权重, 当错误的级别权重⼤于等于leval的时候才会写⼊⽂件
logging.basicConfig(filename='x1.txt',format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S',level=30)    # 当前配置表示30以上的分数会被写⼊⽂件
# CRITICAL = 50
# FATAL = CRITICAL
# ERROR = 40
# WARNING = 30
# WARN = WARNING
# INFO = 20
# DEBUG = 10
# NOTSET = 0
logging.critical("我是critical") # 50分. 最贵的
logging.error("我是error") # 40分logging.warning("我是警告") # 警告 30
logging.info("我是基本信息") # 20
logging.debug("我是调试") # 10
logging.log(2, "我是⾃定义") # ⾃定义. 看着给分

最后, 如果你系统中想要把⽇志⽂件分开,比如,⼀个⼤项⽬,有两个⼦系统,那两个⼦系统要分开记录⽇志,⽅便调试,那怎么办呢?注意,⽤上⾯的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('s1', level=logging.ERROR)
logger1.addHandler(file_handler)
logger1.error('我是A系统')# 再创建⼀个操作⽇志的对象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('s2', level=logging.ERROR)
logger2.addHandler(file_handler2)
logger2.error('我是B系统')

转载于:https://www.cnblogs.com/zpzhue1/p/9948631.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新ANTLR 4.6的重要更改

自从上一个主要版本发布以来,已经过去了将近一年的时间,推出了新的ANTLR版本: 4.6 。 有很多新闻:新的目标,更好的性能,更好的错误处理以及ANTLR本身开发中的一些改进。 新目标 影响最大的新闻可能是新目标…

strcmp可以比较数组么_C语言数组越界了,后果很严重,如何避免?

素材来源:嵌入式ARM所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最常见的错误之一。在 C 语言中,数组必须是静态的。…

MongoDB 问题123

MongoDB 是非关系型数据库中的一种。 出于某些原因,我们用了Mongo。他们说Mongo的最大特点是快。 不过这种快是以空间换时间的代价而得来的。 这个空间代价包括 1.DB至少占用64M(好像是这个数字,因为我们的DB实际往往只有几M,但却要占用那么多&#xff0…

两个excel文档查找相同选项后替换_看似普通的查找和替换功能,用好了,能让你的工作效率翻一番...

关注【新精英充电站】能力提升看得见!在Word中,查找和替换功能是编辑文档时时常要用到的重要功能,它能帮助我们快速将文档或表格中查找到的内容或格式等替换为指定的内容或格式,特别是遇到大量需要修改的相同文字内容或格式时非常…

Mongodb内存管理和使用情况情况查询

overview MongoDB使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做&#…

mapreduce文本排序_MapReduce:通过数据密集型文本处理

mapreduce文本排序自上次发布以来已经有一段时间了,因为我一直忙于Coursera提供的一些课程。 有一些非常有趣的产品,值得一看。 前一段时间,我购买了Jimmy Lin和Chris Dyer的MapReduce数据密集型处理程序 。 本书以伪代码格式介绍了几种关键的…

nginx根据参数转发到不同服务器_Nginx服务器之负载均衡策略

一、关于Nginx的负载均衡在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。二、Nginx负载均衡策略负载均衡用于从“upstream”模块定义…

同步异步与协程

目录: 同步/异步 异步回调 协成 线程队列 同步|异步: 线程的三种状态:   1.就绪   2.运行   3.阻塞阻塞和非阻塞描述的是运行的状态阻塞 :遇到了IO操作,代码卡住,无法执行下一行,CPU会切换到其他任务非阻塞 :与阻塞相反,代码正在执行(运行状态) 或处于就绪状态…

Linux禁止非WHEEL用户使用SU命令

通常情况下,一般用户通过执行“su -”命令、输入正确的root密码,可以登录为root用户来对系统进行管理员级别的配置。 但是,为了更进一步加强系统的安全性,有必要建立一个管理员的 组,只允许这个组的用户来执行“su -”…

代理的JavaOne 2016观察

我无法参加JavaOne 2016,因此很高兴在线上看到大量资源,这些资源使我能够基于JavaOne 2016内容进行观察。 我在本文中引用并简要描述了其中的一些JavaOne 2016资源,并根据这些资源的使用添加了我自己的一些观察结果。 正如Katharine在JavaOne…

resnet过拟合_重读经典:完全解析特征学习大杀器ResNet

公众号关注 “ML-CVer”设为 “星标”,DLCV消息即可送达!作者丨刘昕宸知乎来源丨https://zhuanlan.zhihu.com/p/268308900编辑丨极市平台导读 通过堆叠神经网络层数(增加深度)可以非常有效地增强表征,提升特征学习效果,但是会出现…

Java开发笔记(二十三)数组工具Arrays

数组作为一种组合形式的数据类型,必然要求提供一些处理数组的简便办法,包括数组比较、数组复制、数组排序等等。为此Java专门设计了Arrays工具,该工具包含了几个常用方法,方便程序员对数组进行加工操作。Arrays工具的方法说明如下…

生成对抗网络gan原理_必读!TOP10生成对抗网络GAN论文(附链接)

来源:新智元本文约2200字,建议阅读7分钟。本文所选论文提供了一个易读的对GAN的介绍,帮助你理解GAN技术的基础。[ 导读 ]生成对抗网络 (GAN) 是深度学习中最有趣、最受欢迎的应用之一。本文列出了 10 篇关于 GAN 的论文,这些论文将…

visudo精确用户赋权(sudo)

原文BLOG:http://iminmin.blog.51cto.com/689308/455992sudo” 是 Unix/Linux 平台上的一个非常有用的工具,允许为非根用户赋予一些合理的 “ 权利 ” ,让他们执行一些只有根用户或特许用户才能完成的任务,从而减少根用户的登陆次…

es6中的类及es5类的实现

目录 类的特点类的特点 1.类只能通过new得到 在es6中类的使用只能是通过new,如果你将它作为一个函数执行,将会报错。 //es6的写法 class Child {constructor() {this.name 1;} } let child new Child(); console.log(child.name)//1 //如果直接…

python高阶函数filter_Python进阶系列连载(13)——Python内置高阶函数filter(上)...

前言进阶部分连载继续~如果还没看过我的入门连载部分,先看:当然,小编的免费入门课程已经有咯,看过连载的朋友可以看看视频再快速梳理一遍~前文传送门:filterfilter是什么意思呢?我们百度看看:百…

javaone_JavaOne 2012:观察与印象

javaone我正坐在旧金山国际机场等待登上一架飞机,然后又一次满意但累人的JavaOne(2012)体验,开始撰写这篇特别的博客文章。 自上周日的主题演讲以来,在会议上狂热地撰写了约30篇博客文章之后,再写另一篇博客…

CSDN转载博客的方法

前言 对于喜欢逛CSDN的人来说,看别人的博客确实能够对自己有不小的提高,有时候看到特别好的博客想转载下载,但是不能一个字一个字的敲了,这时候我们就想快速转载别人的博客,把别人的博客移到自己的空间里面&#xff0c…

linux 服务器账号及安全杂谈

1、useradd zhangsan,添加zhangsan用户后,不能交互式登陆该账号。 原因是:/etc/shadow中内容是 zhangsan:!!:16804:0:99998:7::: 其中,两个!!表示出于安全角度,不能登陆。给zhangsan设置密码后,就可以登陆…

mysql-9索引

mysql索引的建立对于mysql的高效运行是很重要的,索引可以大大提高mysql的检索速度。 索引分为单列索引和组合索引。 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。 组合索引,即一个索…