类__约束、异常处理、日志处理、hashlib(加密模块)

一.类的约束。

二、异常处理.

三、MD5的加密。

四、日志。

一.类的约束.

1.在一个类中如果有一个方法是抽象方法. 那么这个类一定是一个抽象类
2.如果一个类中所有的方法都是抽象方法. 这个类可以被称为接口类
3.抽象类中.如果出现一个抽象方法. 此时这个类就不能实例化对象,而且继承的子类也必须将该类中的抽象方法重新定义完才能实例化.

 第一种约束方案:

raise NotImplementedError()  #抛出异常

class Base:
    # 对子类进行了约束. 必须重写该方法
    # 以后上班了. 拿到公司代码之后. 发现了notImplementedError 继承他 直接重写他
    def login(self):
        #     没有被实现错误
        raise NotImplementedError("你要重写一下login这个方法. 否则报错!") # 抛异常  .

class Member(Base):
    def login(self):
        print("我是普通人登录")

class BaWu(Base):
    def login(self):
        print("吧务登录")

class Houtai(Base):
    def login(self): # 报错, 上层程序员写代码没有按照规范来
        print("后台登录")

# 整合这些个功能
def deng(obj):
    obj.login()

m = Member()
bw = BaWu()
ht = Houtai()

deng(m)
deng(bw)
deng(ht)

 

 第二种约束方案:

from abc import ABCMeta, abstractmethod # 类中包含了了抽象⽅方法. 那此时这个类就是个抽象类. 注意: 抽象类可以有普通⽅方法 
class IGame(metaclass=ABCMeta):    # 一个游戏到底怎么玩儿?  你能形容? 流程能一样么?    
    @abstractmethod    
    def play(self):
        pass    
    def turn_off(self):
        print("破B游戏不不玩了, 脱坑了")
class DNFGame(IGame):    # 子类必须实现父类中的抽象方法. 否则子类也是抽象类    
    def play(self):        
        print("dnf的玩儿法")
# g = IGame() # 抽象类不不能创建对象 
dg = DNFGame() 
dg.play()

二、异常处理.

 

 一)自定义异常:随便写一个类. 这个类只要继承了Exception 这个类就是一个异常类就可以作为raise对象(自定义异常,讲究异常的名字要见名知义(从日志看到这个异常名字,知道那个函数\模块出了错)这样,抛出异常,后面的兄弟也好解决.)

class CulException(Exception): #自己定义异常.
    pass

# 如何手动抛出异常
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 CulException("我没办法给你处理这样的运算")  # raise 异常类(错误信息)

print(cul("就不放, 气死你",2))

二)如何处理异常:

1)处理异常用: try...except....来处理错误.

2)报错后如何给出错误信息的节点:(错误信息叫堆栈)

  查看堆栈信息用:import traceback  #导入模块

  traceback.format_exc() #给出错误节点.

import traceback # 用来查看堆栈信息

class GenderException(Exception):
    pass

class Person:
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def xizao(self):
        print(f"{self.name}在洗澡")

def nan_zao_tang_zi(ren):
    if ren.gender == "男":
        ren.xizao()
    else:
        raise GenderException("性别不对. 去对门看看")  # 抛异常是很重要的

try:  #处理异常.防止异常溢出给用户
    p1 = Person("思密达", "不知道")
    p2 = Person("吉祥物", "男")
    nan_zao_tang_zi(p1)
    nan_zao_tang_zi(p2)
except GenderException:
    ret = traceback.format_exc() # 查看堆栈信息, 看错误的
    print(ret)
    print("出错了. 很可惜")

三)在python里所有的异常的根是Exception, 所有的异常类都会默认继承Exception,关于错误异常的类有

1.FileNotFoundError  文件异常

2.ZeroDivisionError  数字异常

try:
    print(1/10)
    f = open("哈哈哈哈哈", mode="r")
    d = {[]:123}
except ZeroDivisionError: # 可以处理所有错误
    print("除以0出错了")
except FileNotFoundError:
    print("文件不存在的错误")
except Exception: # 兜底的
    print("其他错误")
else: # 当try中的代码不产生任何错误的时候. 会自动的执行else里的代码
    pass
finally: # 最终. 不管出错还是不出错. 都要执行最后的finally 一般用来收尾
    print("哈哈哈哈哈哈哈哈啊哈")

三、MD5加密.

 

import hashlib
def my_md5(s): #定义MD5加盐的函数,参数s是要加密的内容.
obj = hashlib.md5(b"fkldsajlkfjlaksd") # 俗称加盐,b的意思是字节,盐定义好后不可随意更改,否则以后无法跟用户输入的值匹配.
obj.update(s.encode("utf-8")) # 把要加密的内容给md5
return obj.hexdigest() #返回的结果就是加密过的
print(my_md5("123456"))

#数据库中存这
username = "wusir"
password = "7f329b79701191ed6489c27676a38eb1"

#登录
uname = input("请输入你的用户名")
upwd = input("请输入你的密码") # 123456
if uname == username and my_md5(upwd) == password:
print("登录成功")
else:
print("登录失败")
# 机器永远不会出错. 出错的只会是人

四、日志.

 简易版日志写法(一般小公司够用了):

import logging

# 配置好日志的处理, 默认就是GBK
logging.basicConfig(filename='x1.txt', # 把日志信息写入的文件名
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S', # 时间的格式
                    level=40) # 当前配置表示 10以上的分数会被写入日件

# 向日志文件写入内容
logging.critical("今天嫂子没有来") # 50, 几乎是最高的
logging.error("昨天嫂子来了") # 40 平时使用最多的就是他
logging.warn("气死我了") # 30  警告
logging.warning("还好吧")
logging.info("提示") # 20 级
logging.debug("开发的时候把这个开着") # 10
logging.log(999, "宝宝今天有懵逼了")

 

升级版.

import logging
# 创建一个操作日志的对象logger(依赖FileHandler) #c
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('腾讯qq', level=10) # 创建一个日志文件处理的对象 logger1.addHandler(file_handler) # 把文件添加到日志 logger1.error("麻花藤明天请大家吃饭. 去不去?") #往日志里面写入信息 # 再创建⼀个操作日志的对象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('百度贴吧', level=logging.DEBUG) logger2.addHandler(file_handler2) logger2.error("我才不去呢. 我们在北京. 离你那么远")#往日志里面写入信息

 

 

举例子:

import traceback  #调入堆栈模块(该模块可以查看异常的具体信息)
class GenderException(Exception):
    pass
class Person:
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
        logger1.info(f"这个人的名字是{self.name}, 这个人的性别是:{self.gender}")
    def xizao(self):
        print(f"{self.name}在洗澡")
class ZaoTang:
    def nan(self, ren):
        if ren.gender == "男":
            ren.xizao()
        else:
            raise GenderException("我这里要的是男人")

    def nv(self, ren):
        if ren.gender == "女":
            ren.xizao()
        else:
            #logger1.error("走错屋了.. ") 也可以在定义函数直接设置异常日志
            raise GenderException("我这里要的是女人")
try: #尝试
    p1 = Person("赵亚磊", "男")
    p2 = Person("林志玲", "女")
    zaotang = ZaoTang()
    zaotang.nan(p2)
    zaotang.nv(p1)
except GenderException:
    print("走错屋里了")
    logger1.error("走错屋了.. ") #往日志里写东西
    logger1.error(traceback.format_exc()) # 把堆栈信息记录在日志文件中
posted @ 2018-12-21 21:36  Tank-Li  阅读(311)  评论(0编辑  收藏  举报