python记录_day019 类的约束 异常处理 日志
一 、约束
python中约束有两种
第一种,通过抛异常进行约束,这种是子类不按我要求的来,我就给你抛异常(推荐)
操作:提取一个父类. 在父类中给出一个方法。但在方法中不给出任何代码,直接抛异常
# 贴吧
# 项目经理(级别高一点儿)
class Base:
def login(self): # 强制子类做xxxx事
raise NotImplementedError("子类没有实现该方法") # 报错. 抛异常 # 1. 普通账号 --> 翔哥
class Normal(Base):
def login(self):
print("普通账号的登录") # 2. 吧务 - > 强哥
class Member(Base):
def login(self):
print("吧务的登录") # 3. 百度员工 -> 明哥
class Admin(Base):
def denglu(self):
print("管理员的登录") # 项目经理
def wodetian(obj):
obj.login() n = Normal()
wodetian(n) m = Member()
wodetian(m) a = Admin()
wodetian(a) #这就会抛出异常,因为没按要求写,找不到login
异常约束
第二种,通过抽象类和抽象方法进行约束,这种是子类不按我要求的来,我就不让子类实例化
操作:提取一个父类,将父类中给出的方法定义为抽象方法,不必实现,直接pass
### 这些概念要记住:
抽象类是不能进行实例化的
如果一个类中有抽象方法,那么这个类就是抽象类
一个抽象类可以有非抽象方法
from abc import ABCMeta, abstractmethod class Base(metaclass=ABCMeta): # 抽象类
# 抽象方法
@abstractmethod
def login(self): # 强制子类做xxxx事,子类必须重写这个方法
pass class Normal(Base):
def login(self):
print("普通登录") class Member(Base):
def login(self):
print("会员登录") class Admin(Base):
def denglu(self):
print('管理员登录') def denglu(obj):
obj.login()
n = Normal()
denglu(n)
m = Member()
denglu(m)
a = Admin() #Can't instantiate abstract class admin with abstract methods login
denglu(a)
抽象约束
二、异常处理
格式:
try:
代码块
except 错误名 as 别名:
出现该错误时做什么
except 错误名 as 别名:
出现该错误时做什么
...
else:
不出错时执行这里
finally:
出不出错都执行这里
解读: 程序先执行操作, 然后如果出错了会走except中的代码. 如果不出错, 执行else中的代码. 不论出不出错. 最后都要执行finally中的语句. 一般我们用try...except就够了. 顶多加上finally. finally一般用来作为收尾工作。
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 Exception("我要的是数字,你输入的是啥") try:
print(cul("一",4))
except Exception as e:
print("错了,你要输入数字")
异常处理
##抛异常
抛异常要用到关键字raise
def add(a, b):
'''
给我传递两个整数. 我帮你计算两个数的和
:param :param a:
:param :param b:
:return :return:
'''
if not type(a) == int and not type(b) == int:
# 当程序运行到这句话的时候. 整个函数的调用会被中断. 并向外抛出一个异常.
raise Exception("不是整数, 朕不能帮你搞定这么复杂的运算.")
return a + b
# 如果调用方不处理异常. 那产生的错误将会继续向外抛. 最后就抛给了用户
add("你好", "我叫赛利亚")
# 如果调用方处理了异常. 那么错误就不会丢给用户. 程序也能正常进行
try:
add("胡辣汤", "滋滋冒油的大腰子")
except Exception as e:
print("报错了. 我要的是数字")
raise
##自定义异常
非常简单. 只要你的类继承了Exception类. 那你的类就是一个异常类
格式:
def 异常名(Exception):
pass
#自定义异常
class GenderException(Exception):
pass class Person: def __init__(self,name,gender):
self.name = name
self.gender = gender def goto_nan(self):
if self.gender !="男":
raise GenderException("性别不对")
else:
print("欢迎光临")
try:
p1 = Person('alex', '男')
p1.goto_nan() p2 = Person('妖姬', '女')
p2.goto_nan() except GenderException as e:
print("你来错地儿了")
except Exception as e:
print("其他错误")
自定义异常
##异常处理好是好,但是有一个问题,我们在调试的时候是希望看到程序哪里出现问题的,而异常处理没有具体的错误信息,那这么办呢?这时需要引入另一个模块traceback. 这个模块可以获取到我们每个方法的调用信息. 又被称为堆栈信息. 这个信息对我们排错是很有帮助的.
import traceback # 继承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:
val = traceback.format_exc() # 获取到堆栈信息
print(e) # 性别不对. 这里是男澡堂子
print(val)
except Exception as e:
print("反正报错了")
结果:
性别不对. 这里是男澡堂子
Traceback (most recent call last):
File "/Users/sylar/PycharmProjects/oldboy/面向对象/day05.py", line 155, in
<module>
nan_zao_tang_xi_zao(p2)
File "/Users/sylar/PycharmProjects/oldboy/面向对象/day05.py", line 144, in
nan_zao_tang_xi_zao
raise GenderError("性别不对. 这里是男澡堂子")
GenderError: 性别不对. 这里是男澡堂子
这样我们就能收放放如了. 当测试代码的时候把堆栈信息打印出来. 但是当到了 线上的生产环境的时候把这个堆栈去掉即可
三、日志(不用记,知道怎么用就行)
当出现任何错误的时候. 我们都可以去日志系统里去查. 看哪里出了问题. 这样在解决问题和bug的时候就多了一个帮手。
那如何在python中创建这个日志系统呢?
1. 导入logging模块.
2. 简单配置一下logging
3. 出现异常的时候(except). 向日志里写错误信息.
#参数解释
# filename: 文件名
# format: 数据的格式化输出. 最终在日志文件中的样子
# 时间-名称-级别-模块: 错误信息
# datefmt: 时间的格式
# level: 错误的级别权重, 当错误的级别权重大于等于leval的时候才会写入文件 import logging #导入模块
#简单配置,一般只需修改level值
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) # 当前配置表示 0以上的分数会被写入文件
# CRITICAL = 50
# FATAL = CRITICAL
# ERROR = 40
# WARNING = 30
# WARN = WARNING
# INFO = 20
# DEBUG = 10
# NOTSET = 0
logging.critical("我是critical") # 写入critical级别信息
logging.error("我是error") # 写入error级别信息
logging.warning("我是警告") # 警告
logging.info("我是基本信息") #
logging.debug("我是调试")
logging.log(2, "我是自定义") # 自定义. 第一个参数可以自己给值,第二个是往日志文件里写的内容
1 import logging
2
3 logging.basicConfig(filename='x1.log',
4 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
5 datefmt='%Y-%m-%d %H:%M:%S',
6 level=35) # 当前配置表示 35以上的级别会被写入文件
7
8 import traceback
9 try:
10 print(1/0)
11 except Exception:
12 logging.error(traceback.format_exc()) # 写入error信息
13 logging.log(36, traceback.format_exc()) # 自定义写入
14 print("出错了")
15 结果:
16 x1.txt内容
17
18 2018-11-12 20:43:01 - root - ERROR -日志系统: Traceback (most recent call last):
19 File "D:/PyCharm/workspace/day019 约束/日志系统.py", line 29, in <module>
20 print(1/0)
21 ZeroDivisionError: division by zero
22
23 2018-11-12 20:43:01 - root - Level 36 -日志系统: Traceback (most recent call last):
24 File "D:/PyCharm/workspace/day019 约束/日志系统.py", line 29, in <module>
25 print(1/0)
26 ZeroDivisionError: division by zero
日志应用
##
最后, 如果你系统中想要把日志文件分开. 比如. 有个大项目, 有两个子系统, 那两个子系 统要分开记录日志. 方便调试. 那怎么办呢? 注意. 用上面的basicConfig是搞不定的. 我们要借助文件助手(FileHandler), 来帮我们完成日志的分开记录
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('a系统', level=logging.ERROR) #级别
logger1.addHandler(file_handler) #把文件助手和日志对象绑定
logger1.error('我是A系统') #写入日志信息 # 再创建一个操作日志的对象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('b系统', level=logging.ERROR) #级别
logger2.addHandler(file_handler2)
logger2.error('我是B系统') #写入日志信息
日志分开
python记录_day019 类的约束 异常处理 日志的更多相关文章
- python之路--类的约束, 异常处理, MD5, 日志处理
一 . 类的约束 1. 写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束. 必须重写该方法 # 以后上班了. 拿到公司代 ...
- Python 入门 之 类的约束以及super()剖析
Python 入门 之 类的约束以及super()剖析 1.类的约束 第一版: class WechatPay: def pay(self): print("微信支付") clas ...
- python学习13-类的约束 异常处理 日志
一 .约束 python中约束有两种 第一种,通过抛异常进行约束,这种是子类不按我要求的来,我就给你抛异常(推荐) 操作:提取一个父类. 在父类中给出一个方法.但在方法中不给出任何代码,直接抛异常 # ...
- python摸爬滚打之day19----类的约束, 异常处理
1.类的约束 父类对子类某些功能的约束. python 中的两种约束: 1, 提取父类, 然后在父类中定义好方法, 该方法什么都不用干, 就通过主动抛出异常 raise NotImplementedE ...
- python 面向对象和类成员和异常处理
python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...
- python记录_day17 类与类之间的关系
一.依赖关系 a类的对象是b类方法的参数 这种关系是我用着你,但你不属于我,比如公司和临时工的关系,是很弱的一种关系 class Zhiwu: def __init__(self,name,atk): ...
- python记录_day16 类的成员
一.变量 1.实例变量(又叫字段.属性) 创建对象时给对象赋值 形式: self.xxx = xxx 访问: 对象名.xxx 只能由对象访问 class Person: def __init_ ...
- Python面向对象04 /封装、多态、鸭子类型、类的约束、super
Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...
- python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super
https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...
随机推荐
- <OFFER15> 15_NumberOf1InBinary
// 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...
- SSM项目问题中遇到 GET请求中有中文的情况
GET传参有中文的情况 特别 由于准备春招,所以希望各位看客方便的话,能去github上面帮我Star一下项目 https://github.com/Draymonders/Campus-Shop 问 ...
- shiro中authc和user的权限区别
前者(authc)是认证过,后者(user)是登录过,如果开启了rememberMe功能的话,后者(user)也是可以通过的,而前者(authc)通过不了.故我们用authc来校验一些关键操作,比如购 ...
- JZ2440之GPIO篇
买来开发板已经有一段时间了,刚接触时兴奋至极,后来跟着视频看下去发现似乎自己并没有学到太多东西,于是发现自己可能欠缺的太多以致从课程中无法提取出重要的东西来,所以并没有得到太多的营养成分.因此我个人认 ...
- ZOJ 3987 Numbers(Java枚举)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3987 题意:给出一个数n,现在要将它分为m个数,这m个数相加起来必须等于n ...
- eclipse中建geoserver源码
概述:本文讲述的是在eclipse中如何构建geoserver源码工程,其中涉及到了jdk,github,marven等. 1.安装git 从(http://git-scm.com/download/ ...
- jqGrid API (转)
来源:https://www.cnblogs.com/MonaSong/p/5109991.html JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGr ...
- 用Let's Encrypt实现Https(Windows环境+Tomcat+Java)
补充1: 已解决20的部分问题,移步这里 单域名下多子域名同时认证HTTPS 补充2: 之前忘了说了,我这个方法只对Tomcat7.0以上有用(要不然就是8.0...) 我自己用的是9.0 原因好像是 ...
- 使用redux简单的实现加法运算(简单的状态改变)
描述该做啥?(action)!具体怎么做(reducer)!统一规划(store:包含reducer+所有的state) 上代码:index.ios.js import React, { Compon ...
- list转化为json数组
今天做项目,用Thrift获取数据,在servlet里面获取的是数组,但是通过Ajax传输到js文件里是一个list,我获取长度失败,这个时候需要将list转化为json数组,我们可以通过eval() ...