![]()
# # 贴吧
# # 项目经理(级别高一点儿)
# 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 login(self): # 方法的覆盖和重写
# print("管理员的登录")
#
# # 项目经理
# def wodetian(obj):
# obj.login()
#
# n = Normal()
# wodetian(n)
#
# m = Member()
# wodetian(m)
#
# a = Admin()
# wodetian(a)
# 在python中可以写出抽象类和抽象方法. 来约束子类
from abc import ABCMeta, abstractmethod
# 贴吧
# 项目经理(级别高一点儿)
# class Base(metaclass=ABCMeta): # 抽象类
# # 抽象方法
# @abstractmethod # staticmethod, classmethod
# def login(self): # 强制子类做xxxx事
# pass
#
# def hehe(self): # 抽象类中可以有正常的方法
# print("我会呵呵呵")
#
# # b = Base() # 报错的. 原因是Base是一个抽象类. 含有抽象方法. 不允许创建对象的
#
# # 一个类如果全部都是抽象方法. 这个类可以被称为接口. 用来约束子类和规范子类
#
# # 1. 普通账号 --> 翔哥
# class Normal(Base):
# pass
# # def login(self): # 重写了父类中的抽象方法
# # print("普通账号的登录")
#
# n = Normal()
'''
当我们需要对子类进行约束:
1.抛出异常 NotImplementedError() 没有实现 -> 约定俗成. 多观察
2.写抽象类
from abc import ABCMeta, abstractmethod
class Base(metaclass = ABCMeta):
@abstractmethod
def 方法(self):
pass
如果一个类中包含了抽象方法. 那么这个类一定是一个抽象类
一个抽象类中可以包含正常的方法
接口: 接口中所有的方法都是抽象方法
子类必须重写父类中的抽象方法. 否则子类也是一个抽象类
'''
# from abc import ABCMeta, abstractmethod
#
# class Animal(metaclass=ABCMeta):
# @abstractmethod
# def chi(self): # 抽象的概念
# pass
#
# class Cat(Animal): # 子类 .
# def chi(self): # 子类对抽象的内容给出具体的实现 . 重写
# print("猫用嘴吃")
#
# c = Cat()
# c.chi()
#
# a = Animal() # 报错. 自己把报错的原因给出
# a.chi()
# 程序员是发现不了自己的错误的(边缘性错误)
'''
try:
xxxx
except 错误名称 as 别名:
出现错误的时候. 要干什么...
except 错误名称 as 别名:
出现错误的是偶. 要干什么
....
except Exception as e: # 所有错误的根
出现的所有的错误. 我都可以这样处理
else: # 很少用到
不出错的时候执行这里的代码
finally:
结束. 收尾工作
'''
# try:
# print(1/0) # 0不能做除数 ZeroDivisionError: division by zero
# except ZeroDivisionError as z:
# print("错了. 除数不能为0")
# 由python解释器来调用代码. 出现了错误. 系统会自动的产生一个叫异常的对象.
# 系统会尝试着把错误返回给调用方. 过程被称为:抛异常
# 我们通过try...except 可以吧系统产生的这个错误获取到. 过程叫捕获异常
# import traceback
# # 计算a+b
# def cul(a, b):
# if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
# return a + b
# else:
# # 在这里有两种方案. 1. 直接返回 , 2. 抛出异常
# # raise 抛出 Exception 错误和异常,所有错误的根
# raise Exception("我要的不是这个. 你应该我传递int或者float")
#
#
# try:
# print(cul(1, "胡辣汤")) # 加上异常的处理
# except Exception as e:
# # 获取到错误信息. 我们需要访问堆栈信息
# print(traceback.format_exc()) # 获取堆栈信息
# print("出现了错误")
# 我们出现的错误. python中没有给出具体的记录, 慎用. 名字一定要符合规范
# JackException
# 自定义异常
# class GenderException(Exception):
# pass
#
# class Person:
# def __init__(self, name, gender):
# self.name = name
# self.gender = gender
#
# # 洗澡 -> 男的进男浴室
# def goto_nan_yushi(self):
# if self.gender != "男":
# raise GenderException("性别不对") # 除了名字以外都是父类中的Exception
# else:
# print("欢迎光临.")
# try:
# p2 = Person("wusir", "女")
# p2.goto_nan_yushi()
# p1 = Person("alex", "男")
# p1.goto_nan_yushi()
# except GenderException as e:
# print("你去男澡堂子干嘛?")
# except Exception as e:
# print("其他错误")
import logging
# 创建⼀个操作⽇志的对象logger(依赖FileHandler)
# open()
file_handler = logging.FileHandler('zuo.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=20)
logger1.addHandler(file_handler) # 把文件助手和日志对象绑定
logger1.error('我是A系统出错了') # 记录日志
# 再创建⼀个操作⽇志的对象logger(依赖FileHandler)
file_handler2 = logging.FileHandler('you.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=20)
logger2.addHandler(file_handler2)
import traceback
try:
print(1/0)
except Exception:
logger2.critical(traceback.format_exc())
print("出错了. 请联系管理员")
print("程序继续知悉个")