020-2018-09-29 约束和异常处理

1.今日内容大纲

一. 昨日内容回顾
    1. issubclass, type, isinstance
        issubclass: 判断xxx是xxx的子类么?
        type: 精准的返回对象的类型
        isinstance: 判断xxxx对象是否是xxx类型的.

    2. 函数和方法
        在类外边, 是函数
        在类里面:
            1. 实例方法: 对象.方法  方法   类名.方法  函数
            2. 静态方法: 都是函数
            3. 类方法: 都是方法

        引入types模块中的FunctionType和MethodType
        isinstance()

    3. 反射
        1. hasattr(obj, str) 判断对象中是否包含xxxx(str)
        2. getattr(obj, str) 从对象中获取xxx(str)
        3. setattr(obj, str, value) 把对象中的str设置成value
        4. delattr(obj, str) 从对象中删除xxxx(str)
二. 作业
三. 今日主要内容
    异常处理(处理, 抛出异常, 自定义异常)
        1. 产生异常. raise 异常类(), 抛出异常
        2. 处理异常:
            try:
                xxxxx # 尝试执行的代码.
            except 异常类 as 变量: # 出现错误的时候. 捕获到异常
                xxxxxx  # 处理异常
        3. 自定义异常
            继承Exception
        4. 堆栈信息
            import traceback
            traceback.format_exc() 获取堆栈信息
    约束(难)
        约束是对子类进行的约束。
        一。 通过抛异常 (简单)
            在父类中给出一个方法。 这个方法中什么都不写。 就抛异常。 NotImplementError()
            在子类中把上述的方法进行重写。
            重写:子类重新定义父类中的方法。


        二。 抽象类和抽象方法(java, c#)
                接口:类中都是抽象方法.
             from abc import ABCMeta, abstractmethod

             抽象方法: 抽象方法不用给出方法体. 写个pass就行了
             抽象类:
                语法:类(metaclass=ABCMeta)
                概念: 如果类中包含了抽象方法.这个类一定是抽象类
                特点: 抽象类一般不创建对象.
                      抽象类中可以存在正常方法

             可以约束子类必须实现抽象方法
    MD5加密
        MD5加密:不可逆
        引入模块 hashlib
            1 创建md5对象
            2.把加密信息交给md5对象
            3.获取密文

    日志处理(重要, 简单)
        引入logging模块
        简单配置即可(basicConfig 单一日志文件  fileHandler 文件助手可以实现多文件操作)
        日志级别:
            CRITICAL 最高的
            ERRO 40
            WARN 30
            INFO 20
            DEBUG 10

    明天预习: C3  新式类, 经典类



2.作业

# <3>
class Base:
    pass

class Foo(Base):
    pass
def func(arg):
    if isinstance(arg, Base): # 约束这个函数传递进来的对象必须是xxx家族体系下的内容
        pass
b = Foo()

# <4>
'''
可以被调用的
    1. 函数()
    2. 类()   创建对象. 初始化对象  __new__  __init__
    3. 对象()   方法__call__()
    4. 对象.方法()
    变量可以被调用么????
        callable(a)
'''

def func(arg):
    if callable(arg): # 判断是会否可以被调用
        return arg()    # 调用
    else:
        print(arg)

# <5>
from types import  FunctionType, MethodType
class Foo:
    pass

class Person:
    def chi(self):
        pass

def func(*args):
    fun_count = 0
    method_count = 0
    foo_object = 0
    for el in args:
        if isinstance(el, FunctionType):
            fun_count += 1
        elif isinstance(el, MethodType):
            method_count += 1
        elif type(el) == Foo:
            foo_object += 1
        else:
            print(el)
    return fun_count, method_count, foo_object # (元组)
lst = [Person.chi,  Person().chi, func, Foo()]
a, b, c = func(*lst)
print(a, b, c)

# <6>
class StarkConfig(object):
    list_display = []
    def get_list_display(self):
        self.list_display.insert(0,33)
        return self.list_display
class RoleConfig(StarkConfig):
    list_display = [11,22]
s1 = StarkConfig()
s2 = StarkConfig()
result1 = s1.get_list_display()
print(result1)
result2 = s2.get_list_display()
print(result2)

# <7>
class StarkConfig(object):
    list_display = []
    def get_list_display(self):
        self.list_display.insert(0,33)
        return self.list_display
class RoleConfig(StarkConfig):
    list_display = [11,22]
s1 = StarkConfig()
s2 = RoleConfig()
result1 = s1.get_list_display()
print(result1)
result2 = s2.get_list_display()
print(result2)

# <8>

class StarkConfig(object):
    list_display = []
    def get_list_display(self):
        self.list_display.insert(0,33)
        return self.list_display
class RoleConfig(StarkConfig):
    list_display = [11,22]
s1 = RoleConfig()
s2 = RoleConfig()
result1 = s1.get_list_display()
print(result1)
result2 = s2.get_list_display()
print(result2)

# <9>
class Base(object):
pass
class Foo(Base):
pass
print(issubclass(Base, Foo))

# <7>
class Foo:
    def __init__(self):
        self.name = '小猪'
        self.age = 100
        self.name = "alex"
    @property
    def haha(self):
        return 10
obj = Foo()
setattr(obj, 'email', 'wupeiqi@xx.com')
print(obj.__dict__)


# <13>
class Foo(object):
    def __init__(self):
        self.name = ' '
        self.age = 100
obj = Foo()
setattr(Foo, 'email', 'wupeiqi@xx.com')
v1 = getattr(obj, 'email')
v2 = getattr(Foo, 'email')
print(v1,v2)



class Perseon:
    # 这个类如果写了__iter__ 这个类的对象就是一个可迭代对象
    # def __iter__(self):
    #     # 准备写一个迭代器
    #     # 生成器就是迭代器
    #     return (i for i in range(10))

    def __call__(self, *args, **kwargs):
        print("刘伟好帅")
obj = Perseon()
obj()
for el in obj:
    print(el)

#
# it = obj.__iter__()
# print(it.__next__())
# print(it.__next__())
# print(it.__next__())
# print(it.__next__())
# print(it.__next__())


3.异常处理


# 程序运行过程中产生的错误, 不正常
def chufa(a, b):
   try: # 尝试执行xxx代码
       ret = a/b # 如果这里出现了错误. 异常. 系统内部会产生一个异常对象. 系统会把这个错误抛出. 抛给调用方
       return ret
   except ZeroDivisionError as e: # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e
       print(e)
       print("出错了. 0不能是除数")
   except FileNotFoundError as e:  # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e
       print(e)
       print("出错了. 0不能是除数")
   except StopIteration as e:  # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e
       print(e)
       print("出错了. 0不能是除数")
   except Exception as e:  # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e
       print(e)
       print("出错了. 0不能是除数")

    .....
ret = chufa(10, 0)
print(ret)


# 计算两个整数的加法
def add(a, b):
    if type(a)!=int or type(b) != int:
        # return
        raise TypeError("我这里只要int, 不要别的类型")
    return a + b

add(123, "abc")




import traceback

class GenderError(Exception):
    pass

class Person:
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

def nan_gu_ke_xi_zao(per):
    if per.gender != "男":
        raise GenderError("这里是刘伟的男澡堂子. ")
    else:
        pass
p1 = Person("alex", "不详")
# nan_gu_ke_xi_zao(p1)
p2 = Person("wusir", "不详")
try:
    nan_gu_ke_xi_zao(p2)
except GenderError as g:
    print(g)
    val = traceback.format_exc() # 获取错误堆栈
    print(val)

4.约束

class Base:
    def login(self):
        raise NotImplementedError("没有实现login方法") # 专业的写法
    def kantie(self):
        raise NotImplementedError("没有实现看帖功能")
# 张三
class Normal(Base):
    def login(self):
        print("普通人登陆")

# 李四
class Member(Base):
    def denglu(self):
        print("吧务登陆")

# 王五
class Admin(Base):
    def login(self):
        print("管理员登陆")

def login(obj):
    print("产生验证码")
    obj.login() # 标准在这里.  必须由login
    print("进入主页")

# 场景
n = Normal()
m = Member()
a = Admin()
login(n)
login(m)
login(a)




# 重写:子类对父类提供的方法不满意。 重新去定义这个方法

from abc import ABCMeta, abstractmethod

class Animal(metaclass=ABCMeta): # 在父类中写出metaclass= xxx  抽象类, 类中存在抽象方法, 类一定是抽象类

    @abstractmethod # 抽象方法
    def chi(self): # 抽象的概念.
        pass
    def haha(self):
        print("娃哈哈")


class Cat(Animal): # 子类必须实现父类中的抽象方法.
    def chi(self):  # 具体的实现
        print("猫爱吃鱼")

Cat()







from abc import ABCMeta,abstractmethod

class Base(metaclass=ABCMeta):
    @abstractmethod
    def login(self):pass

# 张三
class Normal(Base):
    def login(self):
        print("普通人登陆")

# 李四
class Member(Base):
    def login(self):
        print("吧务登陆")

# 王五
class Admin(Base):
    def login(self):
        print("管理员登陆")

def login(obj):
    print("产生验证码")
    obj.login() # 标准在这里.  必须由login
    print("进入主页")

# 场景
n = Normal()
m = Member()
a = Admin()
login(n)
login(m)
login(a)

5.MD5加密

import hashlib

# 1. 创建一个MD5对象
obj = hashlib.md5(b"flkjsdalkfjklasdjfklasjkflasdjklfasdjflkadsj") # 加盐

# 2. 把要加密的内容给md5
obj.update("alex".encode("utf-8")) # 必须是字节

# 3. 获取密文
val = obj.hexdigest()   # 534b44a19bf18d20b71ecc4eb77c572f aa7aa5ec13222b27f76a094207c5ac75
print(val)






def my_md5(val):
    obj = hashlib.md5(b"flkjsdalkfjklasdjfklasjkflasdjklfasdjflkadsj")
    obj.update(val.encode("utf-8"))
    val = obj.hexdigest()
    return val




# 注册的时候. 用md5进行加密. 存储的是加密后的密文
username = input("请输入用户名")
password = input("请输入密码")
# cun = my_md5(password)
# print(cun) # alex 26adff81aa6778d26999b95ddc0e50b2
if username == "alex" and my_md5(password) == "26adff81aa6778d26999b95ddc0e50b2":
    print("登录成功")
else:
    print("登录失败")


6.日志处理

import logging

logging.basicConfig(filename='app.log',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    level=40)    # level 设置级别. 当你的信息的级别>=level的时候才会写入日志文件, 默认30

# CRITICAL = 50
# FATAL = CRITICAL
# ERROR = 40
# WARNING = 30
# WARN = WARNING
# INFO = 20
# DEBUG = 10
# NOTSET = 0
# 写日志
logging.critical("我是critical")
logging.error("我是error")
logging.warning("我是警告")
logging.info("我是基本信息")
logging.debug("我是调试")
logging.log(2, "我是自定义")
import traceback

for i in range(20):
    try:
        if i % 3 == 0:
            raise FileNotFoundError("我是FileNotFountException")
        elif i % 3 == 1:
            raise StopIteration()
        elif i % 3 == 2:
            raise KeyError()

    except FileNotFoundError as e:
        val = traceback.format_exc()
        logging.error(val)
    except StopIteration as e:
        val = traceback.format_exc()
        logging.error(val)
    except KeyError as e:
        val = traceback.format_exc()
        logging.error(val)
    except Exception as e:
        val = traceback.format_exc()
        logging.error(val)


# 多文件日志处理
# 创建⼀个操作⽇志的对象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=40)
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=40)
logger2.addHandler(file_handler2)
# 记录日志
logger2.error('我是B系统')





7.其他文件

<1>.app.log

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 28, in <module>
    raise FileNotFoundError("我是FileNotFountException")
FileNotFoundError: 我是FileNotFountException

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 30, in <module>
    raise StopIteration()
StopIteration

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 32, in <module>
    raise KeyError()
KeyError

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 28, in <module>
    raise FileNotFoundError("我是FileNotFountException")
FileNotFoundError: 我是FileNotFountException

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 30, in <module>
    raise StopIteration()
StopIteration

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 32, in <module>
    raise KeyError()
KeyError

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 28, in <module>
    raise FileNotFoundError("我是FileNotFountException")
FileNotFoundError: 我是FileNotFountException

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 30, in <module>
    raise StopIteration()
StopIteration

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 32, in <module>
    raise KeyError()
KeyError

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 28, in <module>
    raise FileNotFoundError("我是FileNotFountException")
FileNotFoundError: 我是FileNotFountException

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 30, in <module>
    raise StopIteration()
StopIteration

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 32, in <module>
    raise KeyError()
KeyError

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 28, in <module>
    raise FileNotFoundError("我是FileNotFountException")
FileNotFoundError: 我是FileNotFountException

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 30, in <module>
    raise StopIteration()
StopIteration

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 32, in <module>
    raise KeyError()
KeyError

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 28, in <module>
    raise FileNotFoundError("我是FileNotFountException")
FileNotFoundError: 我是FileNotFountException

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 30, in <module>
    raise StopIteration()
StopIteration

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 32, in <module>
    raise KeyError()
KeyError

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 28, in <module>
    raise FileNotFoundError("我是FileNotFountException")
FileNotFoundError: 我是FileNotFountException

2018-09-29 12:53:39 - root - ERROR - 06 日志处理: Traceback (most recent call last):
  File "D:/python_workspace/day020 约束和异常处理/06 日志处理.py", line 30, in <module>
    raise StopIteration()
StopIteration

<2>.l1.log

2018-09-29 12:59:33,180 - A - ERROR -06 日志处理: 我是A系统

<3>.l2.log

2018-09-29 12:59:33,181 - B -ERROR -06 日志处理: 我是B系统

<4>.handler.py

class Base(object):
    pass
class F1(Base):
    pass
class F2(Base):
    pass
class F3(F2):
    pass
class F4(Base):
    pass




class F5(object):
    pass
class F6(F5):
    pass

<5>.run.py

import handler

def func():
    objs = []
    name_list = dir(handler)
    # 去掉__
    new_lst = []
    for el in name_list:
        if el.startswith("__") and el.endswith("__"):
            new_lst.append(el)
    for el in new_lst:
        name_list.remove(el)

    # filter() => isinstance

    base_sub_list = []
    for name in name_list:
        cls = getattr(handler, name)
        if issubclass(cls, getattr(handler, "Base")) and cls != getattr(handler, "Base"):
            base_sub_list.append(cls())

    print(base_sub_list)

if __name__ == '__main__':
    func()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值