python约束 异常 MD5 日志处理

一.约束

1.用父类执行约束

  子类继承父类,用重写方法,对子类的方法进行约束.

class Foo:
    def login(self):    # 对子类进行约束,该方法需要重写
        #     没有执行的错误
        raise NotImplementedError ("login重写")  # 抛出 NotImplementedError错误

class Member(Foo):
    def login(self):
        print("我是普通登陆")

class BaWu(Foo):
    def login(self):
        print("我是吧务登陆")

class HouTai(Foo):
    def denglu(self):
        print("我是后台登陆")

def fn(obj):
    obj.login()

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

fn(m)
fn(bw)
fn(ht)

2.定义抽象类进行约束

  抽象类中的抽象方法不能执行,报错约束

from abc import ABCMeta ,abstractmethod  #导入抽象类模块

class Foo(metaclass=ABCMeta):  # 定义一个抽象类 元类  

    @abstractmethod                 # 定义一个 抽象方法
    def login(self):pass

    def back(self):             # 抽象类中可以写正常方法
        print("退出登陆")


class Member(Foo):
    def login(self):
        print("我是普通登陆")



class BaWu(Foo):
    def login(self):
        print("我是吧务登陆")


class HouTai(Foo):
    def denglu(self):
        print("我是后台登陆")

def fn(obj):
    obj.login()

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

fn(m)
fn(bw)
fn(ht)

m.back()

抽象类总结:

  1.子类必须重写父类的方法,否则子类也是抽象类

  2.抽象类不能创建对象

  3.有抽象方法的类,就是抽象类

  4.抽象类可以有方法

二.异常处理

1.处理异常错误

  格式     try...except...

try:                 # 处理异常 try ... except...
    print(1/0)
except ZeroDivisionError:  
  print("0不能做除数")
  print("hah")
try:
    print(1/0)
except Exception:           # 可以处理所有错误,一般在最下面兜底用
    print("我能拦截下面吗")
except ZeroDivisionError:
    print("0不能做除数")

  格式      try...except...except...else...finally

try:
    # print(1/0)
    f = open("dssadas",mode="r")
except ZeroDivisionError:
    print("0不能做除数")
except FileNotFoundError:
    print("找不到文件")
except Exception:           # 可以处理所有错误,一般在最下面兜底用
    print("我能兜底")
else:     # 当try中的代码不产生任何错误的时候,会自动执行else里的代码
    print("没有出错?")   # 这里一般放pass
finally: # 最终,不管出错还是不出错,都要执行最后的finally
    print("哈哈哈")

2.自定义异常

  因为所有的异常类都继承Exception 所以写一个继承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 抛出  raise 异常类(错误信息)
        raise CulException("这是自己定义的异常类,抛出")

print(cul("sdf",25))

3.查看堆栈

  可以查看到具体某一行出错

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 man_zaotang(t):
    if t.gender == "男":
        t.xizao()
    else:
        raise GenderException("进错了")    # 抛出异常很重要

try:
    p = Person("小明","女")
    man_zaotang(p)
except GenderException:
    ret = traceback.format_exc()   # 查看堆栈信息,看错误信息的
    print(ret)  

三.MD5加密

  导入模块使用,不可逆的一种加密方式

import hashlib
def my_md5(s):
    obj = hashlib.md5(b"dasds")    # 加盐  防止被破解
    obj.update(s.encode("utf-8"))    # 给s字符串加密
    return obj.hexdigest()          # 获取密文

uname = input("用户名:")
upwd = input("密码:")

if uname == "admin" and my_md5(upwd) == "f5cb18dbc8aae8b87c9129ff3156e0d5":
    print("登陆成功")

else:
    print("帐号或者密码错误")

四.日志处理

  日志一般不需要更改很多,只需要设置参数,有模板

1.单一日志模板

import logging
 # 单一项目模块
logging.basicConfig(
    filename="1.log",  # 把日志信息写入的文件名
    #          时间                    等级名               模块名       写入信息
    format="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S", #
    level=40  # 设置等级 超过这个的都写入日志
)
# 向日志文件写入内容
logging.critical("我几乎是最高等级50")
logging.error("我是错误,等级40")
logging.warning("我是警告,等级30")
logging.info("我是提示,等级20")
logging.debug("我是debug,等级10")
logging.log(600,"写入内容")

2.多个日志模板

import logging

file_handler = logging.FileHandler("2.log","a","utf-8")  # 创建日志文件
file_handler.setFormatter(
    logging.Formatter(
        # 日志格式
        fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))

logger1 = logging.Logger("dnf",level=10)  # 设置日志处理对象和等级
logger1.addHandler(file_handler)    # 把文件添加到日志

logger1.error("看看错误")    # 错误信息

file_handler2 = logging.FileHandler("3.log","a","utf-8")
file_handler2.setFormatter(
    logging.Formatter(
        fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"
    )
)

logger2 = logging.Logger("lol",level=logging.DEBUG)
logger2.addHandler(file_handler2)

logger2.critical("????")     # 哪里需要记录日志就放到哪里,要设置等级

猜你喜欢

转载自www.cnblogs.com/q767498226/p/10158644.html