zoukankan      html  css  js  c++  java
  • 异常处理,元类

    1. 什么是异常处理
    异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常
    没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止

    异常包含三个部分:
    1. traceback异常的追踪信息
    2. 异常的类型
    3. 异常的信息

    错误分为两大类:
    1. 语法上的错误:在程序运行前就应该立即修正
    2. 逻辑上的错误

    2. 为何要异常处理

    避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性

    3. 如何异常处理

    try:
        代码1
        代码2
        代码3
        ......
    except NameError:
        print("当抛出的异常是NameError时执行的子代码块")
    except ....:
        pass
    except ...:
        pass
    else:  
        print("else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行")
    finally:
        print("finally必须放到最后面,finally的子代码块无论被检测的代码有没有异常都会执行")

    万能异常类型Exception:可以匹配任意类型的异常

    raise 主动抛出异常
    assrt 断言

    什么是元类:
    源自一句话:在python中,一切皆对象,而对象都是由类实例化得到的
    对象tea1是调用OldboyTeacher类得到的,如果说一切皆对象,那么OldboyTeacher也是一个对象,只要是对象
    都是调用一个类实例化得到的,即OldboyTeacher=元类(...),内置的元类是type


    关系:
    1. 调用元类---->自定义的类
    2. 调用自定义的类---->自定义的对象


    class关键字创建自定义类的底层的工作原理,分为四步
    1. 先拿到类名:'OldboyTeacher'
    2. 再拿到类的基类们:(object,)
    3. 然后拿到类的名称空间???(执行类体代码,将产生的名字放到类的名称空间也就是一个字典里,补充exec)
    4. 调用元类实例化得到自定义的类: OldboyTeacher=type('OldboyTeacher',(object,),{...})

    自定义类的三个关键组成部分:
    1. 类名
    2. 类的基类们
    3. 类的名称空间


    继承了type的类才能称之为自定义的元类,否则就是只是一个普通的类
    对象之所以可以调用,是因为对象的类中有一个函数__call__
    推导:如果一切皆对象,那么OldboyTeacher也是一个对象,该对象之所可以调用,肯定是这个对象的类中也定义了一
    个函数__call__

    实例化OldboyTeacher,或者说调用OldboyTeacher会
    1. 先产生一个空对象
    2. 执行__init__方法,完成对象的初始属性操作
    3. 返回初始化好的那个对象

    定义元类模板

    class Meta(type):
        def __init__(self, class_name, class_bases, class_dic):
            self.class_name = class_name
            self.class_bases = class_bases
            self.class_dic = class_dic
    
        def __call__(self, *args, **kwargs):
            car_obj = self.__new__(self)
            self.__init__(car_obj, *args, **kwargs)
            return car_obj


    属性查找
    先按照mro列表 检索到object为止
    然后查找元类

  • 相关阅读:
    zoj 3627#模拟#枚举
    Codeforces 432D Prefixes and Suffixes kmp
    hdu 4778 Gems Fight! 状压dp
    CodeForces 379D 暴力 枚举
    HDU 4022 stl multiset
    手动转一下田神的2048
    【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
    poj 3254 状压dp
    C++中运算符的优先级
    内存中的数据对齐
  • 原文地址:https://www.cnblogs.com/liangchengyang/p/9544545.html
Copyright © 2011-2022 走看看