• 一、约束
    • 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、定义 我们可以在程序之中自定义异常,让异常被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')
      

       

posted on 2018-09-04 16:43  哈尔斯塔特  阅读(84)  评论(0编辑  收藏  举报