我们要约束程序的结构. 也就是说. 在分配任务之前就应该把功能定义好. 然后分别交给底下的程序员来完成相应的功能.
在python中有两种办法来解决这样的问题.
1. 提取父类. 然后在父类中定义好方法. 在这个方法中什么都不用干. 就抛⼀个异 常就可以了了. 这样所有的子类都必须重写这个方法. 否则. 访问的时候就会报
错.2. 使⽤用元类来描述父类. 在元类中给出⼀一个抽象方法. 这样子类就不得不给出抽象方法的具体实现. 也可以起到约束的效果.
class Base: def login(self): raise NotImplementedError class Normal(Base): def login(self): print("普通账号的登陆") class Merber (Base): def login(self): print("吧务的登陆") class Admin(Base): def jj(self):#抛出这个异常 print("管理员的登陆") def zhuce(obj): obj.login() n = Normal() zhuce(n) m = Merber() zhuce(m) a = Admin() zhuce(a) 第二种用抽象方法
from abc import ABCMeta,abstractmethod class Base(metaclass=ABCMeta): @abstractmethod def login(self): pass def hehe(self): print("我会呵呵") b = Base() #报错的,原因是Base是一个抽象类,含有抽象方法,不允许创建对象 当我们需要对子类进行约束: 1.抛出异常 NotImplementedError() 没有实现 -> 约定俗成. 多观察 2.写抽象类 from abc import ABCMeta, abstractmethod class Base(metaclass = ABCMeta): @abstractmethod def 方法(self): pass 如果一个类中包含了抽象方法. 那么这个类一定是一个抽象类 一个抽象类中可以包含正常的方法 接口: 接口中所有的方法都是抽象方法 子类必须重写父类中的抽象方法. 否则子类也是一个抽象类 二、异常处理 程序员是发现不了自己的错误的(边缘性错误) try: xxxx except 错误名称 as 别名: 出现错误的时候. 要干什么... except 错误名称 as 别名: 出现错误的是偶. 要干什么 .... except Exception as e: # 所有错误的根 出现的所有的错误. 我都可以这样处理 else: # 很少用到 不出错的时候执行这里的代码 finally: 结束. 收尾工作 try: print(1/0) # 0不能做除数 ZeroDivisionError: division by zero except ZeroDivisionError as z: print("错了. 除数不能为0") 由python解释器来调用代码. 出现了错误. 系统会自动的产生一个叫异常的对象. 系统会尝试着把错误返回给调用方. 过程被称为:抛异常 我们通过try...except 可以吧系统产生的这个错误获取到. 过程叫捕获异常
import traceback #计算a+b def cul(a,b): if (type(a)==int or type(a)==float) and (type(b)==int or type(b)==float): return a+b else: raise Exception("我要的不是这个") try: print(cul(1,"aff")) except Exception as e: print(traceback.format_exc())#获取堆栈信息 print("出现了错误") 自定义异常
class GenderException(Exception): pass class Person: def __init__(self,name,gender): self.name = name self.gender = gender def xizao(self): if self.gender != "男": raise GenderException("性别不对") else: print("欢迎光临") try: p1 = Person("wusir","女") p1.xizao() except GenderException as e: print("你去男澡堂干嘛") except Exception as e: print("其他错误") MD5密文处理
import hashlib obj = hashlib.mad5(b"safx") obj.update("alex".encode("utf-8")) miwen = obj.hexdigest() print(miwen) 五. 日志 ⾸首先, 你要知道在编写任何⼀一款软件的时候, 都会出现各种各样的问题或者bug. 这些问 题或者bug⼀一般都会在测试的时候给处理理掉. 但是多多少少的都会出现⼀一些意想不到的异常 或者错误. 那这个时候, 我们是不知道哪⾥里里出了了问题的. 因为很多BUG都不是必现的bug. 如果 是必现的. 测试的时候肯定能测出来. 最头疼的就是这种不必现的bug. 我这跑没问题. 客户那 ⼀一⽤用就出问题. 那怎么办呢?我们需要给软件准备⼀一套⽇日志系统. 当出现任何错误的时候. 我 们都可以去⽇日志系统⾥里里去查. 看哪⾥里里出了了问题. 这样在解决问题和bug的时候就多了了⼀一个帮⼿手. 那如何在python中创建这个⽇日志系统呢? 很简单. 1. 导入logging模块. 2. 简单配置⼀一下logging 3. 出现异常的时候(except). 向日志⾥里里写错误信息.
# import logging # # filename: ⽂件名 # # format: 数据的格式化输出. 最终在⽇志⽂件中的样⼦ # # 时间-名称-级别-模块: 错误信息 # # datefmt: 时间的格式 # # level: 错误的级别权重, 当错误的级别权重⼤于等于leval的时候才会写⼊⽂件 # logging.basicConfig(filename='x1.log', # format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', # datefmt='%Y-%m-%d %H:%M:%S', # level=30) # # 当前配置表示 0以上的分数会被写⼊⽂件 # # 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("我是warning") # logging.info("我是info") # logging.debug("我是debug") # logging.log(1, "我什么都不是") # # import traceback # try: # print(1/0) # except Exception: # logging.error(traceback.format_exc()) # 用法 # print("出错了")
import logging # 创建⼀个操作⽇志的对象logger(依赖FileHandler) # open() file_handler = logging.FileHandler('zuo.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=20) logger1.addHandler(file_handler) # 把文件助手和日志对象绑定 logger1.error('我是A系统出错了') # 记录日志
# 再创建⼀个操作⽇志的对象logger(依赖FileHandler) file_handler2 = logging.FileHandler('you.log', 'a', encoding='utf-8') file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s")) logger2 = logging.Logger('B系统', level=20) logger2.addHandler(file_handler2)