标签: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 = b‘2erer3asdfwerxdf34sdfsdfs90‘ #字节类型 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