- 一、约束
- 1、接口
- 在jave或者c#中有这样一种特殊的类,interface Foo:,此种类型里面可以定义方法,但是无法写代码,这个接口只能约束他的派生类,若他的派生类中未重新定义此方法,将会抛出错误
- 2、抽象类和抽象方法
- 在这三种语言中都拥有抽象类和抽象方法,在抽象类中也可以定义普通方法,,也可以定义抽象类,普通方法之中可以定义任何功能,但是抽象方法之中不能定义任何代码,它和接口所起的作用是一样的,都是为自己的派生类起约束作用,但是一般使用的不太多
rom abc import ABCMeta,abstractmethod #在定义抽象类之前我们需要先引入模块 class Base(metaclass=ABCMeta): # 抽象类 def f1(self): print(123) @abstractmethod # 抽象类中定义抽象方法之前需要加入修饰符号 def f2(self): # 抽象方法 pass
- 在这三种语言中都拥有抽象类和抽象方法,在抽象类中也可以定义普通方法,,也可以定义抽象类,普通方法之中可以定义任何功能,但是抽象方法之中不能定义任何代码,它和接口所起的作用是一样的,都是为自己的派生类起约束作用,但是一般使用的不太多
- 3、python中的一般约束方法
- 1、python中一般不使用抽象类或者抽象方法来实现约束作用,一般我们会为所约束的类定义一个父类,在父类中定义需约束的方法,然后在里面抛出异常NotImplementError,若是在被约束类之中未重新定义方法,就会抛出异常
class BaseMessage(object): def send(self,x1): """ 必须继承BaseMessage,然后其中必须编写send方法。用于完成具体业务逻辑。 """ raise NotImplementedError(".send() 必须被重写.") class Email(BaseMessage): def send(self,x1): """ 必须继承BaseMessage,然后其中必须编写send方法。用于完成具体业务逻辑。 """ pass
- 2、不仅可以约束方法,参数也可以约束。
- 3、约束即是约束别人,也是提醒别人,某些功能必须被实现
- 1、python中一般不使用抽象类或者抽象方法来实现约束作用,一般我们会为所约束的类定义一个父类,在父类中定义需约束的方法,然后在里面抛出异常NotImplementError,若是在被约束类之中未重新定义方法,就会抛出异常
- 1、接口
- 二、自定义异常
- 1、定义 我们可以在程序之中自定义异常,让异常被except捕捉,最后打印出异常信息
- 2、首先需要注意的便是定义异常类,该异常类必须作为Exception的派生类,这是为了后面可以被except捕捉,方便打印异常信息
import os class ExistsError(Exception): pass class KeyInvalidError(Exception): pass def new_func(path,prev): """ 去path路径的文件中,找到前缀为prev的一行数据,获取数据并返回给调用者。 1000,成功 1001,文件不存在 1002,关键字为空 1003,未知错误 ... :return: """ response = {'code':1000,'data':None} try: if not os.path.exists(path): raise ExistsError() if not prev: raise KeyInvalidError() pass except ExistsError as e: response['code'] = 1001 response['data'] = '文件不存在' except KeyInvalidError as e: response['code'] = 1002 response['data'] = '关键字为空' except Exception as e: response['code'] = 1003 response['data'] = '未知错误' return response
- 三、加密
- 1、我们可以引入hashlib模块
- 2、步骤首相我们需要创建一个md5对象(当然这里使用其他的加密算法也是可以的,比如说:sha),写入需要加密的字节,最后获取秘文,注意加密过程一旦进行,就无法被反解,这个加密算法是不可逆的。md5生成的是一个32位的随机数
- 3、撞库,加密之后无法被反解,所以有心人就想出一个叫撞库的方法暴力反解,将比较常见的密码和它的秘文全都破解出来,然后去对应着秘闻找,循化对比
- 4、为了防止撞库,可以采取加盐的做法,在获取md5对象时,我们可以在其中加入参数,然后参数和秘闻就会一起被加密,不容易被撞库
- 5、加密同样适用于数据移植性校验,首先我们需要明白md(b“hello”)然后在md(b"world")和同时md(b”helloworld“)得到的结果是一样,即md满足追加加密,所以在进行数据移植的时候我可以在移值前先进行一次数据加密,在移值后再进行一次数据加密,通过对比两次加密结果变可以验证数据的完整性
- 四、logging模块
- 1、日志是给开发人员看的,主要用于排查错误。
- 2、我们可以使用使用logging模块生成错误日志,然后写入文件之中供查看
import logging import traceback logger = logging.basicConfig(filename='x.txt', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=30) logging.debug('x1') # 10 logging.info('x2') # 20 logging.warning('x3') # 30 logging.error('x4') # 40 logging.critical('x5') # 50 logging.log(10,'x6') def func(): try: a = a +1 except Exception as e: # 获取当前错误的堆栈信息 msg = traceback.format_exc() logging.error(msg) func()
- 3、若是还需要看见更加的详细的错误信息,需再次引入trackback模块
- 4、若是需要将错误分类进行写入,则需要自定义模板,手动创建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('123123123') # 在创建一个操作日志的对象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('666')