Python 18 约束和异常处理
约束和异常
1.类的约束
- 提取父类. 然后在子类中定义好方法. 在这个方法中什么都不用干. 就抛一个异
常就可以了. 这样所有的子类都必须重写这个方法. 否则. 访问的时候就会报错 - 使用元类来描述父类. 在元类中给出一个抽象⽅法. 这样子类就不得不给出抽象
方法的具体实现. 也可以起到约束的效果.
方法一 ↓↓↓
def login(self):
raise Exception("你没有实现login⽅法()")
class Normal(Base):
def login(self):
pass
class Member(Base):
def denglu(self):
pass
class Admin(Base):
def login(self):
pass
# 项目经理写的总入口
def login(obj):
print("准备启动程序.......")
obj.login()
print("进入主程序.......")
n = Normal()
m = Member()
a = Admin()
login(n)
login(m) # 报错.
login(a)
方法二 ↓↓↓
写抽象类和抽象方法.
需要引入abc模块中的 ABCMeta 和 abstractmethod
from abc import ABCMeta, abstractmethod
class Base(metaclass=ABCMeta):
@abstractmethod
def login(self):
pass
class Normal(Base):
def loin(self):
pass
class Member(Base):
def denglu(self): # 这个就没用了
pass
def login(self): # 子类对父类进行实现
pass
class Admin(Base):
def login(self):
pass
def login(obj):
print("准备进入程序.......")
obj.login()
print("进入主程序.......")
n = Normal()
m = Member()
a = Admin()
login(n)
login(m)
login(a)
1). 使用抽象类和抽象方法, 由于该方案来源是java和c#. 所以使用频率还是很少的
2). 使用人为抛出异常的方案. 并且尽量抛出的是NotImplementError. 这样比较专
业, 而且错误比较明确.(推荐)
2.异常处理
def num():
return a/b
rt = num(2,0)
print(rt) # 直接报错
上面就直接报错了,除数不能是0
def num():
return a/b
try:
rt = num(2,0)
print(rt)
except Exception as e:
print("除数不能是0")
直接将报错结果变成 除数不能是0
用 try 和 except拦截异常,并将异常对象抛给e
3.自定义异常
只要你的类继承了Exception类. 那你的类就是一个异常类.
class GenderError(Exception):
pass
class Person:
def __init__(self, name, gender):
self.name = name
self.gender = gender
def nan_zao_tang_xi_zao(person):
if person.gender != "男":
raise GenderError("性别不对. 这里是男澡堂子")
p1 = Person("alex", "男")
p2 = Person("eggon", "蛋")
# nan_zao_tang_xi_zao(p1)
# nan_zao_tang_xi_zao(p2) # 报错. 会抛出一个异常: GenderError
# 处理异常
try:
nan_zao_tang_xi_zao(p1)
nan_zao_tang_xi_zao(p2)
except GenderError as e:
print(e) # 性别不对, 这⾥是男澡堂⼦
except Exception as e:
print("反正报错了")
4.MD5加密
MD5是一种不可逆的加密算法. 它是可靠的. 并且安全的. 在python中我们不需要手写
这套算法. 只需要引入一个叫hashlib的模块就能搞定MD5的加密工作
import hashlib
obj = hashlib.md5()
obj.update("alex".encode("utf-8")) # 加密的必须是字节
miwen = obj.hexdigest()
print(miwen) # 534b44a19bf18d20b71ecc4eb77c572f
可是上面这样的加密是不安全的, 很容易会产生撞库
看下面
import hashlib
obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf") # 加入这些就安全了
obj.update("alex".encode("utf-8")) # 加密的必须是字节
miwen = obj.hexdigest()
print(miwen) # 99fca4b872fa901aac30c3e952ca786d
加密的应用
import hashlib
def my_md5(s):
obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf")
obj.update(s.encode("utf-8")) # 加密的必须是字节
miwen = obj.hexdigest()
return miwen
username = input("请输入用户名:")
password = input("请输入密码:")
if username == "wusir" and my_md5(password) =="99fca4b872fa901aac30c3e952ca786d":
print("成功")
else:
print("失败")
5.日志
- 导入logging模块.
- 简单配置一下logging
- 出现异常的时候(except). 向日志里写错误信息.
logging.basicConfig(filename='x1.txt',
format='%(asctime)s - %(name)s - %(levelname)s -%
(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=0) # 当前配置表示 10以上的分数会被写入文件
logging.critical("我是critical") # 50分. 最贵的
logging.error("我是error") # 40分
logging.warning("我是警告") # 警告 30
logging.info("我是基本信息") # 20
logging.debug("我是调试") # 10
logging.log(2, "我是自定义") # 自定义. 看着给分
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0