zoukankan      html  css  js  c++  java
  • 学习日记0827异常处理 元类 自定义元类 自定义元类来实例化类 属性查找顺序

    异常处理

      什么是异常处理:

        异常是程序运行过程中发生错误的信号,一旦程序中出现异常,并且没有被处理,那么这个异常就会被抛出,并且程序会因此终止

        异常包含三个部分:

          1 traceback异常的追踪信息

          2 异常的类型

          3 异常的信息

        错误分为两大类:

          1 语法上的错误

          2 逻辑上的错误

      怎么处理异常:

        

    try:
        #要处理的可能含有异常的语句
    Except 异常类型 as 变量名(里面存放的是要抛出的异常的信息):
        #抛出异常是处理的代码

      万能异常类型:

        Exception

      try.....Except.....else当没有异常时会执行的语句(需要放在Except的后面)....finally最后执行的语句(一般存放回收系统资源的语句)....

    元类

      什么是元类:

        在python中一切皆对象,那么有一些没有被实例化过的对象是怎么来的呢,它们都是由元类type实例化得到的

      如:

    class OldboyTeacher:
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
        def score(self):
            print('%s is scoring' %self.name)
    
    tea1=OldboyTeacher('egon',18,'male')#对象tea1是OldboyTeacher实例化得来的,那么对象OldboyTeacher是元类type实例化得来的
    # print(type(tea1))
    print(type(OldboyTeacher))

      class的底层原理:

        1 得到类名

        2 得到类的基类

        3 拿到类的名称空间

        4 调用元类type实例化类

      

    class_name = 'OldBoy'
    class_base = (object,)
    class_dic = {}
    class_body="""
    school = 'Oldboy'
    
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    
    def score(self):
        print('%s is scoring' %self.name)
    """
    exec(class_body,{},class_dic)
    OldBoy = type(class_name,class_base,class_dic)

    自定义一个元类来控制类的产生:

        (关键点:__init__是在实例化对象是自动调用方法,而OldboyTeacher实质就是Mymate这个元类实例化产生的类(也可以说是对象),应为在OldboyTeacher()的()中会传入4个值依次是1类的类型

    2 类名 3 父类 4 名称空间,所以在重新__init__方法时也要有4个值)

    class Mymate(type):#凡是继承了type的类都叫元类
        def __init__(self,class_name,class_base,class_dic):
               if not class_name.lower():
                    raise typeError('类型必须是驼峰体')
    
        doc=class_dic.get('__doc__')
            if doc is None or len(doc) == 0 or len(doc.strip('
     ')) == 0:
                raise TypeError('类体中必须有文档注释,且文档注释不能为空')
    
    class OldboyTeacher(object,metaclass=Mymeta): #OldboyTeacher=Mymeta('OldboyTeacher',(object,),{...})
        school = 'Oldboy'
    
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
        def score(self):
            print('%s is scoring' %self.name)
    print(OldboyTeacher.__dict__)

    自定义一个元类来控制类的实例化:

      (关键点:__call__内置方法 是在对象产生完成之后再调用这个产生的对象而自动调用的方法)

    class Mymate(type):
        def __call__(self,*args,**kwargs):
            obj = self.__new__(self)
            obj.__init__(obj,*args,**kwargs)
            return obj
    class OldboyTeacher(object,metaclass=Mymeta): 
        school = 'Oldboy'
    
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
        def score(self):
            print('%s is scoring' %self.name)
    
    tea1=OldboyTeacher('egon',18,'male') # 会触发OldboyTeacher的类(即元类)中的    __call__函数
    tea1()
  • 相关阅读:
    模糊查询三种解决方式
    trim标签&&MyBatis内置参数
    ResultMap&&鉴别器&&别名
    增加null&&使用HashMap存储查询结果集
    MyBatis处理多个参数问题
    SpringCloud中使用Zuul实现路由网关
    SpringCloud分布式config配置中心
    FeignClient的参数传递给服务提供方的方式(简单数据类型、对象)
    Hystrix的使用实例***
    什么是缓存穿透、缓存击穿
  • 原文地址:https://www.cnblogs.com/jianhaozhou/p/9544143.html
Copyright © 2011-2022 走看看