码迷,mamicode.com
首页 > 其他好文 > 详细

约束 加密 日志模块

时间:2018-08-31 19:21:25      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:att   hash   cme   ogg   warning   取数据   bar   ack   user   

一  讨论一下约束                                                                                     

python 中使用什么来约束呢?

-抽象类 +抽象方法      特点编写上麻烦

-人为主动抛出      实例如下

class BaseMessage(object):  #约束继承他的派生类必须实现其中指定的方法
  def send(self,x1):
        """
        必须继承BaseMessage,然后其中必须编写send方法。用于完成具体业务逻辑。
        """
        raise NotImplementedError(".send() 必须被重写.")
#用:raise Exception(".send() 必须被重写.")    不专业
class Email(BaseMessage): def send(self,x1): """ 必须继承BaseMessage,然后其中必须编写send方法。用于完成具体业务逻辑。 """ pass

python抽象类加抽象方法的实例如下

from abc import ABCMeta,abstractmethod


class Base(metaclass=ABCMeta): # 抽象类

    def f1(self):     #里面可以包含普通方法
    print(123)


    @abstractmethod
    def f2(self):   # 抽象方法
        pass

class Foo(Base): # 子类中必须含有父类中的抽象方def f2(self):
        print(666)


obj = Foo()
obj.f1()

 

 

再多说一句,python 很少用抽象类加抽象方法的来做约束,比较麻烦.抽象类有两个作用,不但能够提供给子类提供公共的方法和变量使用,还可以约束派生类.

不行得再多说一句哈哈:Java中是怎么约束的呢?Java中也有两种方法   接口     抽象类+抽象方法.

接口只能用来做约束,功能单一.举个例子如下看看吧(看之前要知道java是编译型语言)

#接口,接口中不允许在方法内部写代码,只能约束继承它的类必须实现接口中定义的所有方法。
                interface IFoo:
                    
                    def f1(self,x1):pass 
                    
                    def f2(self,x1):pass 
                    
                interface IBar:
                    
                    def f3(self,x1):pass 
                    
                    def f4(self,x1):pass 
                
                class Foo(IFoo,IBar):# 实现了2个接口
                    
                    def f1(self,x1):pass 
                    
                    def f2(self,x1):pass 
                    
                    def f3(self,x1):pass 
                    
                    def f4(self,x1):pass 

来来就上面看到的来总结一下 接口的定义怎样描述更加准确吧

接口是一种数据类型,主要用于约束派生类中必须实现指定的方法,只有java c#中存在

 

二  讨论下自定义异常                                                                                  

先说下  主动抛出异常        raise   Kryerror("随便写点原因")

难以描述先看个例子吧

      
        class MyException(Exception): #自定义异常  像以前见到的keyerror,nameerror都是类
            def __init__(self,code,msg):#且一定要继承Exception
                self.code = code
                self.msg = msg
        try:
            # 知识点:主动抛出异常 
            raise MyException(1000,操作异常)

        except KeyError as obj:
            print(obj,1111)
        except MyException as obj: # 嗖嗖的将异常捕获了
            print(obj,2222)
        except Exception as obj:#Exception  是老大要写在最后,最后出手
            print(obj,3333)

上面这个例子理解了是吧,那要把下面这个例子搞明白

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):  #巧妙用到not
        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

#下面用的是本方法,强烈推荐上面的方法,因为因为可以是业务逻辑简单化
def func(path,prev):
    """
    去path路径的文件中,找到前缀为prev的一行数据,获取数据并返回给调用者。
        1000,成功
        1001,文件不存在
        1002,关键字为空
        1003,未知错误
        ...
    :return:
    """
    response = {code:1000,data:None}
    try:
        if not os.path.exists(path):
            response[code] = 1001
            response[data] = 文件不存在
            return response
        if not prev:
            response[code] = 1002
            response[data] = 关键字为空
            return response
        pass
    except Exception as e:
        response[code] = 1003
        response[data] = 未知错误
    return response

def show():
    return 8


def run():
  run()

加个塞

如何获取错误的堆栈信息
import
traceback
def func(): try: a = a +1 except Exception as e: # 获取当前错误的堆栈信息 msg = traceback.format_exc() return msg print(func()) #

File "C:/Users/Administrator/AppData/Local/Temp/HZ$D.280.1227/HZ$D.280.1235/day26/10.日志.py", line 33, in func
a = a +1
UnboundLocalError: local variable ‘a‘ referenced before assignment

 

 

三  讨论下加密

说加密肯定要提 hashlib    (哈希)模块

先举个实例把\吧

import hashlib   #将哈希模块导入

SALT = b2erer3asdfwerxdf34sdfsdfs90‘  #字节类型

def md5(pwd):       #md5()函数就是用来加密的
# 实例化对象 obj = hashlib.md5(SALT) # 写入要加密的字节 obj.update(pwd.encode(utf-8)) #pwd是要加密的字# 获取密文 return obj.hexdigest() # 21232f297a57a5a743894a0e4a801fc3 # 66fbdc0f98f68d69cd458b0cee975fe3 # c5395258d82599e5f1bec3be1e4dea4a user = input("请输入用户名:") pwd = input("请输入密码:") #下面是已经加密过的密码与用户登录密码比对.用密文进行比对 if user == oldboy and md5(pwd) == c5395258d82599e5f1bec3be1e4dea4a: print(登录成功) else: print(登录失败)


下面是获取一个密码的密文
import hashlib
salt = b‘ui89‘
def md5(pwd):
obj = hashlib.md5(salt)
obj.update(pwd.encode("utf-8"))
return obj.hexdigest()
print(md5("mimi")) #没加盐之前dde6ecd6406700aa000b213c843a3091 加盐之后301af0cfd0c10971d6375b21847e0e9b

四 讨论日志

import logging

logger = logging.basicConfig(filename=xxxxxxx.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‘)


import traceback

def func():
    try:
        a = a +1
    except Exception as e:
        # 获取当前错误的堆栈信息
        msg = traceback.format_exc()
        logging.error(msg)
func()
import logging

logger1 = logging.basicConfig(filename=x1.txt,
                             format=%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s,
                             datefmt=%Y-%m-%d %H:%M:%S,
                             level=30)

logger2 = logging.basicConfig(filename=x2.txt,
                             format=%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s,
                             datefmt=%Y-%m-%d %H:%M:%S,
                             level=30)


logging.error(x4)   #即使你定义了两个日志,所有的错误还会写到第一个日至中
logging.error(x5)

怎样可以自由发挥想写那个日志就写那个日志呢  那就自定义日志了.

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)

 

约束 加密 日志模块

标签:att   hash   cme   ogg   warning   取数据   bar   ack   user   

原文地址:https://www.cnblogs.com/lxx7/p/9567204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!