我们要约束程序的结构. 也就是说. 在分配任务之前就应该把功能定义好. 然后分别交给底下的程序员来完成相应的功能.
在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)
# 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)