Python基础20_类的约束,异常处理,MD5加密,日志

一. 类的约束

约束程序的结构, 在分配任务之前就应该把功能定义好, 然后分别交给底下的程序员来完成相应的功能

在python中有两种办法来解决这样的问题

1. 提取父类, 然后在父类中定义好方法, 在方法中抛出一个异常, 这样所有继承父类的子类都必须重写这个方法, 否则访问的时候就会报错

class Base:

def login(self):

raise NotImplementedError   # 没有被实现错误, 要求子类必须重写login方法 , 不然抛出异常

class User(Base):

def login(self):

print("用户登陆")

class UserManager(Base):

def login(self):

print("用户管理员登陆")

class Coder(Base):

def login(self):

print("后台程序员登陆")

def func(obj):

obj.login()

u = User()

um = UserManager()

c = Coder()

func(u)

func(um)

func(c)

2. 使用元类来描述父类, 在元类中给出一个抽象方法, 这样子类就不得不给出抽象方法的具体实现, 也可以起到约束的效果, 也就是子类必须重写该方法使之不在抽象, 就可以创建对象了

from abc import ABCMeta, abstractmethod

class Animal(metaclass = ABCMeta):

@abstractmethod

def eat(self):

print("吃什么")

class Cat(Animal):

def eat(self):

print("猫吃鱼")

c = Cat()

c.eat()

抽象方法: 不需要给出具体的方法体, 抽象方法内只写一个pass就行

抽象类: 有抽象方法的类就是抽象类, 抽象类不能创建对象, 抽象类中可以有正常方法

接口: 如果一个类中所有的方法都是抽象方法, 那么这个类就是一个接口

总结: 约束, 就是父类对子类进行约束, 子类必须要重写方法, 在python中约束的方式和方法有两种: (1).使用人为抛出异常的方案, 并且尽量抛出的是NotImplementError, 这样比较专业, 而且错误比较明确(2). 使用抽象类和抽象方法, 由于该方案来源于java和c#, 所以使用频率还是很少的

二. 异常处理

异常就是程序运行时发生错误的信号(在程序出现错误时, 则会产生一个异常, 若程序没有处理它, 则会抛出该异常, 程序的运行也会终止)

错误分为两种: 语法错误和逻辑错误

异常处理语法:

try:

"""操作"""

except     ZeroDivisionError ad e:

"""除数不能为0"""

except FileNotFoundError as e:

"""文件不存在"""

except Exception as e:

"""异常的父类, 可以捕获所有的异常"""

else:

""""保护不抛出异常的代码, 当try中无异常的时候执行"""

finally:

"""最后要执行的操作,总会被执行,收尾操作"""

执行流程: 程序先执行操作, 然后如果走错了会走except中的代码, 如果不出错, 执行else中的代码. 无论如何, 程序最后都会执行finally中的语句

自定义异常: 只要你的类继承了Exception类, 那你的类就是一个异常类,

我们在调试的时候, 最好能看到错误源在哪里, 这是需要引入一个模块traceback, 可以获得我们每个方法的调试信息, 又称为堆栈信息, 这个信息对我们排错是很有帮助的

import traceback

class GenderError(Exception):

pass

class Person:

def __init__(self, name, gender):

self.name = name

self.gender = gender

def nan_zao_tang_xi_zao(person):

if person.gender != "男":

raise GenderExceptionError("性别不对, 这里是男澡堂子")

p1 = Person("alex", "男")

p2 = Person("eggon", "蛋")

# 处理异常

try:

nan_zao_tang_xi_zao(p1)

nan_zao_tang_xi_zao(p2)

except GenderError as e:

val = traceback.format_exc()         # 获取到堆栈信息

print(e)

print(val)                            # 打印堆栈信息

except Exception as e:

print("反正报错了")

四. MD5加密

数据库中的密码要以加密的方式存储

MD5算法是一种不可逆的加密算法, 它是可靠地, 安全的. python中只需要引入hashlib模块就能搞定MD5的加密工作

import hashlib

def my_md5(s):

obj = hashlib.md5(b"fasdffgggqgqeger")        # 加盐

obj.update(s.encode("utf-8"))                # 加密的必须是字节

miwen = obj.hexdigest()

return miwen

username = input("请输入用户名:")

password = input("请输入密码:")

print(my_md5("alex"))

if username == "wusir" and my_md5(password) == "f9a17839b68095c7e847c3b476a0f9fd" :

print("登陆成功")

else:

print("失败")

五. 日志

为了测试不必现的bug, 我们需要给软件准备一套日志系统, 当出现任何错误的时候, 我们都可以去日志系统查询, python中创建日志系统:

1. 导入logging模块

2. 简单配置一下logging

3. 出现异常的时候(except), 向日志里面写错误信息

具体有两种方式:

1. 一个日志文件

import traceback

import logging

logging.basicConfig(filename = "x1.txt",

format = "%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s",

datefmt = "%Y-%m-%d %H:%M:%S",

level = 10)

# file.name 文件名

# format 数据的格式化输出, 最终在日志文件中的样子

#     时间 - 名称 - 级别 - 模块: 错误信息

# datefmt 时间的格式

# level 错误的级别权重, 当错误的级别权重大于等于level的时候才会写入文件

# logging.critical("我是critical")          # 50

# logging.ERROR("我是error")                # 40

# logging.warning("我是警告")                 # 30

# logging.info("我是基本信息")              # 20

# logging.DEBUG("我是调试")                   # 10

# logging.log(2, "我是自定义")

class JackError(Exception):

pass

for i in range(5):

try:

if i % 3 == 0:

raise FileNotFoundError

elif i % 3 == 1:

raise KeyError

elif i % 3 == 2:

raise JackError

except FileExistsError:

val = traceback.format_exc()

logging.error(val)

except KeyError:

val = traceback.format_exc()

logging.error(val)

except JackError:

val = traceback.format_exc()

logging.error(val)

except Exception:

val = traceback.format_exc()

logging.error(val)

2. 子系统要分开记录日志, 方便调试, 借助文件助手(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/guyannanfei/p/10159177.html

时间: 2024-08-10 21:36:40

Python基础20_类的约束,异常处理,MD5加密,日志的相关文章

python之路--类的约束, 异常处理, MD5, 日志处理

1. 类的约束 1. 写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束. 必须重写该方法 # 以后上班了. 拿到公司代码之后. 发现了notImplementedError 继承他 直接重写他 def login(self): # 没有被实现错误 raise NotImplementedError("你要重写一下login这个方法. 否则报错!") # 抛异常 . class Member(Base): d

Python面向对象(约束,异常处理,md5加密)(五)

1. 类的约束 1. 写一个父类. 父类中的某个方法要抛出一个异常 NotImplementedError class Base: def login(self): raise NotImplementedError("没有实现登录") class Person(Base): def login(self): print("正常使用") class SpecialPerson(Base): def denglu(self): print("非正常"

MD5工具类,提供字符串MD5加密、文件MD5值获取(校验)功能

MD5工具类,提供字符串MD5加密(校验).文件MD5值获取(校验)功能 : package com.yzu.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; impor

python之路---20 约束 异常处理 MD5 日志

三十九, 一.类的约束 1.抛出异常    NotImplementedError 2.抽象方法 含有抽象方法的类是抽象类 抽象类中的方法全是抽象方法的是接口 抽象类不能创建对象 二.异常处理 处理完后代码可继续运行 所有异常的根是Exception 1.基本语法 2.自定义异常    (继承Exception异常的根) 自定义异常  加 异常处理 3.堆栈信息(显示错误信息的具体位置) 需引入模块 三.MD5加密   不可逆 固定格式: 应用: 四.日志 1. 2.?个?项?, 有两个?系统,

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

1,异常处理 一般的异常处理说的是抛异常和处理异常 异常处理从产生异常开始语法: 抛异常:产生异常raise Exception("") 处理异常语法: 处理异常try: 操作except Exception as e: 异常父类,可以捕获所有异常else: 保护不抛出异常的代码,当try中午异常的时候执行finall: 最后总要执行我 自定义异常类,只需要继承Exception语法: 自定义异常class Gandererror(Exception): pass 处理异常用法: 1

Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1)   静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法.普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访

20 约束 异常处理 MD5 日志

三十九, 一.类的约束 1.抛出异常    NotImplementedError 2.抽象方法 含有抽象方法的类是抽象类 抽象类中的方法全是抽象方法的是接口 抽象类不能创建对象 二.异常处理 处理完后代码可继续运行 所有异常的根是Exception 1.基本语法 2.自定义异常    (继承Exception异常的根) 自定义异常  加 异常处理 3.堆栈信息(显示错误信息的具体位置) 需引入模块 三.MD5加密   不可逆 固定格式: 应用: 四.日志 1. 2.?个?项?, 有两个?系统,

python--类的约束, 异常处理, MD5, 日志处理

一 . 类的约束 1. 写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束. 必须重写该方法 # 以后上班了. 拿到公司代码之后. 发现了notImplementedError 继承他 直接重写他 def login(self): # 没有被实现错误 raise NotImplementedError("你要重写一下login这个方法. 否则报错!") # 抛异常 . class Member(Base):

.Net程序员之Python基础教程学习----函数和异常处理[Fifth Day]

   今天主要记录,Python中函数的使用以及异常处理. 一.函数:    1.函数的创建以及调用. def Add(val1,val2): return val1+val2; print Add(1,2) 2. 定义返回多参数的函数,返回的参数以元组的形式返回,可以通过下表索引来获取单个值,下面是获取两数之差和两数之和的函数. 整体上来说还是不错的,在C#中我们一般都用out来实现,多个参数改变返回,不过那样可读性不好. def GetSubAndSum(val1,val2): return