pyrhon类约束及异常处理和日志模块

类的约束

class Base:     #对子类进行了约束,必须重写该方法
     def login(self):
         print(‘方法错误,必须用定义login方法‘)
         # 发现了notImplementedError继承他,直接重写他
         # raise NotImplementedError("你要重写一下login这个方法,否则报错!")    # 抛异常

 class Member(Base):
     def login(self):
         print(‘我的功能是普通用户登录‘)
 class Admin(Base):
     def login(self):
         print(‘我的功能是版主登录‘)
 class Houtai(Base):
     # def denglu(self):     #报错,上层程序员写代码没有按照规范来
     #     print(‘我的功能是管理员登录‘)

     def login(self):
         print(‘我的功能是管理员登录‘)

 def Deng(obj):      # 整合这些个功能
     obj.login()
 m = Member()
 admin = Admin()
 ht = Houtai()
 Deng(m)
 Deng(admin)
 Deng(ht)
 结果
 我的功能是普通用户登录
 我的功能是版主登录
 我的功能是管理员登录

抽象类和抽象方法
抽象方法不需要给出具体的方法体,抽象方法内只写一个pass就可以了
在一个类中如果有一个方法是抽象方法,那么这个类一定是一个抽象类
抽象类中,如果有抽象方法,此时这个类不能创建对象
如果一个类中所有的方法都是抽象方法,这个类可以被称为接口类
写一个抽象方法:
导入一个模块

from abc import ABCMeta,abstractmethod
class Animal(metaclass=ABCMeta):    #就是个抽象类
    @abstractmethod
    def chi(self):  # 吃只是一个抽象概念,没办法完美的描述出来吃什么东西
        pass

    def he(self):   # 抽象类中可以有正常的方法
        print(‘喝水‘)

class Cat(Animal):  # 此时Cat里面也有一个抽象方法,此时的Cat是创建不了对象的
    pass

class Dog(Animal):
    def chi(self):  # 重写父类中的抽象方法
        print(‘狗吃肉‘)
# c = Cat()
# c.chi()   #TypeError: Can‘t instantiate abstract class Cat with abstract methods chi
d = Dog()
d.chi()
结果
狗吃肉

MD5加密

import hashlib
obj = hashlib.md5(b‘盐‘) #盐又称杂质,通常密码中添加,虽然MD5不可逆推,但是不加盐可以撞库算出密码
obj.update(‘密码‘.encode(‘utf-8‘))
print(obj.hexdigest())
结果
一串MD5数字

案例
import hashlib
#定义自己的MD5功能
def my_md5(s):
    obj = hashlib.md5(b‘zazhi‘)      # 加盐
    obj.update(s.encode(‘utf-8‘))    #把要加密的内容给md5
    return obj.hexdigest()
print(my_md5(‘123456‘))

user = ‘bob‘
pwd = ‘abf6a5b33687f111e79f615a6d1fb76a‘

#登录
uname = input(‘用户名:‘)
upwd = input(‘密码:‘)
if uname == user and my_md5(upwd) == pwd:
    print(‘登录成功‘)
else:
    print(‘登录失败‘)

异常处理

print(1 / 0)
print(‘哈哈哈哈哈‘)
结果
ZeroDivisionError: division by zero

# 0不能做除数,在程序执行的时候产生了一个错误
# 系统会抛出这个错误,如果没有人处理,错误就会显示给用户

单行异常处理
try:
    print(1/0)
except ZeroDivisionError:
    print(‘报错ZeroDivisionError‘)
结果
报错ZeroDivisionError

多行异常处理
如果在异常处理的时候,其中一个报错类型触发,其他的报错类型就不会触发,处理完触发的报错后自动退出

try:
    print(1/10)
    f =  open(‘‘,‘r‘)
    dic = {[]:123}
except ZeroDivisionError:        #处理ZeroDivisionError类型错误
    print(‘报错ZeroDivisionError‘)
except FileNotFoundError:       #处理FileNotFoundError类型错误
    print(‘报错FileNotFoundError‘)
except Exception:               # 可以处理所有错误
    print(‘其他所有类型错误‘)
else:                           # 当try中的代码不产生任何错误的时候,会自动的执行else里的代码
    print(‘没有错误时候执行这句话‘)
finally:                        # 最终,不管出错还是不出错,都要执行最后的finally,一般用来收尾
    print(‘无论有没有错误都执行‘)
结果
0.1
报错FileNotFoundError
无论有没有错误都执行

自定义异常
class 类(Exception):
    pass
随便写一个类,这个类只要继承了Exception这个类就是一个异常类就可以作为raise对象
抛出异常
raise 异常类(错误信息)

class TextException(Exception):     #自定义异常
    pass

def Text(a,b):
    if (type(a) == int or type(a) == float ) and (type(b) == int or type(b) == float):
        return a + b
    else:
        raise TextException(‘Text函数错误‘)     #raise 抛出异常
print(Text(‘哈哈‘,2))
结果
Traceback (most recent call last):
  File "E:/Py3Practise/day01/test.py", line 11, in <module>
    print(Text(‘哈哈‘,2))
  File "E:/Py3Practise/day01/test.py", line 10, in Text
    raise TextException(‘Text函数错误‘)
__main__.TextException: Text函数错误

堆栈
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 xz(self):
        print(f‘{self.name}在洗澡‘)
def nan(ren):
    if ren.gender == ‘男‘:
        ren.xz()
    else:
        raise GenderException(‘男女有别‘)   # 抛异常是很重要的
try:
    p1 = Person(‘bob‘,‘不详‘)
    p2 = Person(‘jack‘,‘男‘)
    nan(p1)
    nan(p2)
except GenderException:
    ret = traceback.format_exc()    # 查看堆栈信息,看错误的
    print(ret)
    # print(‘报错了‘)               #自定义堆栈信息
结果
Traceback (most recent call last):
  File "E:/Py3Practise/day01/test.py", line 20, in <module>
    nan(p1)
  File "E:/Py3Practise/day01/test.py", line 16, in nan
    raise GenderException(‘男女有别‘)
GenderException: 男女有别

日志处理
import logging
日志等级:
critical: 50
error: 40
warning: 30
info: 20
debug: 10

记录日志初级版本
配置好日志的处理,默认就是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=30)   # 当前配置表示 30及以上的日志信息会被写入日志文件,30以下的不记录

# 向日志文件写入内容
logging.critical("系统要爆炸")   # 50 几乎是最高的
logging.error("服务程序宕机")    # 40 平时使用最多的就是他
logging.warn("服务发生了一个警告") # 30 警告
logging.warning("和warn一样发生了一个警告")
logging.info("提示信息")        # 20 提示信息
logging.debug("调试信息开发要开着") # 10 详细执行信息
logging.log(999, "自定义了一个日志级别")
日志格式
2018-12-21 19:52:53 - root - CRITICAL -test: 系统要爆炸
2018-12-21 19:52:53 - root - ERROR -test: 服务程序宕机
2018-12-21 19:52:53 - root - WARNING -test: 服务发生了一个警告
2018-12-21 19:52:53 - root - WARNING -test: 和warn一样发生了一个警告
2018-12-21 19:52:53 - root - INFO -test: 提示信息
2018-12-21 19:52:53 - root - DEBUG -test: 调试信息开发要开着
2018-12-21 19:52:53 - root - Level 999 -test: 自定义了一个日志级别

创建一个操作日志的对象logger(依赖FileHandler)

import logging
file_handler = logging.FileHandler(‘test.log‘, ‘a‘, encoding=‘utf-8‘) # 创建文件
file_handler.setFormatter(logging.Formatter(
    fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) # 设置日志文件的格式
logger1 = logging.Logger(‘测试程序CRM系统‘, level=10) # 创建一个日志文件处理对象
logger1.addHandler(file_handler)                    # 把文件添加到日志
logger1.error("这是测试程序CRM系统调试debug日志")
日志格式
2018-12-21 20:03:09,148 - 测试程序CRM系统 - ERROR -test: 这是测试程序CRM系统调试debug日志

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("这个自动化系统调试DEBUG日志")
日志格式
2018-12-21 20:03:09,148 - 自动化系统 -ERROR -test: 这个自动化系统调试DEBUG日志

事例
import logging
file_handler = logging.FileHandler(‘test.log‘, ‘a‘, encoding=‘utf-8‘) # 创建文件
file_handler.setFormatter(logging.Formatter(
    fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) # 设置日志文件的格式
logger1 = logging.Logger(‘测试程序CRM系统‘, level=10) # 创建一个日志文件处理对象
logger1.addHandler(file_handler) # 把文件添加到日志
logger1.error("这是测试程序CRM系统调试debug日志")

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("这个自动化系统调试DEBUG日志")

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 xz(self):
        print(f‘{self.name}在洗澡‘)

class Zt:
    def nan(self,ren):
        if ren.gender == ‘男‘:
            ren.xz()
        else:
            raise GenderException("我这里要的是男人")

    def nv(self,ren):
        if ren.gender == ‘女‘:
            ren.xz()
        else:
            raise GenderException("我这里要的是女人")
try:
    p1 = Person(‘jack‘,‘男‘)
    p2 = Person(‘bob‘,‘女‘)
    zaotang = Zt()
    zaotang.nan(p2)
    zaotang.nv(p1)
except GenderException:
    print(‘走错了‘)
    logger1.error(‘走错屋了‘)
    logger1.error(traceback.format_exc())
结果
走错了
日志结果
2018-12-21 20:25:48,478 - 测试程序CRM系统 - ERROR -test: 这是测试程序CRM系统调试debug日志
2018-12-21 20:25:48,478 - 测试程序CRM系统 - INFO -test: 姓名jack,性别男
2018-12-21 20:25:48,478 - 测试程序CRM系统 - INFO -test: 姓名bob,性别女
2018-12-21 20:25:48,479 - 测试程序CRM系统 - ERROR -test: 走错屋了
2018-12-21 20:25:48,479 - 测试程序CRM系统 - ERROR -test: Traceback (most recent call last):
  File "E:/Py3Practise/day01/test.py", line 46, in <module>
    zaotang.nan(p2)
  File "E:/Py3Practise/day01/test.py", line 35, in nan
    raise GenderException("我这里要的是男人")
GenderException: 我这里要的是男人

原文地址:https://www.cnblogs.com/wangm-0824/p/10199639.html

时间: 2024-11-01 19:15:11

pyrhon类约束及异常处理和日志模块的相关文章

python之路--类的约束, 异常处理, MD5, 日志处理

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

python--类的约束, 异常处理, MD5, 日志处理

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

约束和异常处理

本节主要内容: 1. 类的约束 2. 异常处理理 3. 自定义异常 4. MD5加密 5. 日志 一.类的约束 首先,要清楚.约束是对类的约束.每个人和每个人写代码用的方法名和类名都不一样假如你处理一个用户登录,有三个不同级别的登陆要求分别分给三个人写你要知道程序员不一定有那么好的默契.很有可能三个人会写不同的方法,比如就像是这样: class Normal: # 张三, 普通?登录 def login(self): pass class Member: # 李四, 会员登录 def dengl

Python入门之logging日志模块以及多进程日志

本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python的logging模块提供了灵活的标准模块,使得任何Python程序都可以使用这个第三方模块来实现日志记录.python logging 官方文档 logging框架中主要由四个部分组成: Loggers: 可供程序直接调用的接口 Handlers: 决定将日志记录分配至正确的目的地 Filters:

基础入门_Python-模块和包.运维开发中日志模块logging的最佳实践?

简单介绍: 说明: 此模块儿提供了文件,HTTP GET/POST,SMTP,SOCKET等方式实现日志记录,甚至可以自动实现具体的日志记录方式 快速安装: pip install --upgrade logging 处理流程: 日志级别: 属性名称 属性说明 logging.NOTSET 默认为0 logging.DEBUG 调试为10 logging.INFO 一般为20 logging.WARN 警告为30 logging.ERROR 错误为40 logging.CRITICAL 严重为5

微软企业库研究之日志模块

很久之前研究微软的企业库时候写的,要注意需要引用Microsoft.Practices.EnterpriseLibrary.Logging组件库,因为ASP.NET5出来,微软在.netframework中自带了Logger,所以应该以后也不会用上. using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.T

ns3 Tutorial 中的日志模块(翻译)

转载地址:http://blog.sina.com.cn/s/blog_8ecca79b0101d7fe.html 1  日志模块的使用 在运行 first.cc 脚本时,我们已经简单了解了日志模块.现在,我们将更深入地了解日志子系统是为哪些用户案例设计的. 1.1 日志概述 很多大型系统支持某种消息记录功能,ns3 也不例外.在某些情况下,只有错误消息会被记录到操作控制台(在基于 Unix 的系统中通常是标准错误输出).在其他系统中,警告消息可能跟详细的信息消息一起被输出.在某些情况下,日志功

python标准日志模块logging及日志系统设计

转载:http://www.cnblogs.com/goodhacker/p/3355660.html python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件,只要这样使用: 1 import logging 2 3 # 创建一个logger 4 logger = logging.getLogger('mylogger') 5 logger.setLevel(loggi

python 自动化之路 logging日志模块

logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511919766/article/details/25136485 清晰明了,入门必备http://my.oschina.net/leejun2005/blog/126713 继承讲的很棒http://my.oschina.net/u/126495/blog/464892 实例分析 一:概述 在实际项目