• Python 29 异常处理, 元类


    所学内容

    异常处理(常用)

    AttributeError ··························  试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
    IOError ·······································  输入/输出异常;基本上是无法打开文件
    ImportErro ································· 无法引入模块或包;基本上是路径问题或名称错误
    IndentationError ····················   语法错 误(的子类) ;代码没有正确对齐
    IndexError  ································  下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
    KeyError ·····································  试图访问字典里不存在的键
    KeyboardInterrupt Ctrl+C ···· 被按下
    NameError ································· 使用一个还未被赋予对象的变量
    SyntaxError Python ················· 代码非法,代码不能编译(个人认为这是语法错误,写错了)
    TypeError ···································· 传入对象类型与要求的不符合
    UnboundLocalError ················· 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
    ValueError ··································· 传入一个调用者不期望的值,即使值的类型是正确的

    元类

    1 什么是元类:
     源自一句话:在python中,一切皆对象,而对象都是由类实例化得到的

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

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

    自定义类的三个关键组成部分:

     1. 类名
     2. 类的基类们
     3. 类的名称空间

    异常处理

    1、 什么是异常处理

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

      异常包含三个部分:traceback 异常的追踪信息,异常的类型,异常的信息

      错误分为两大类:

          语法的错误:在程序运行前就应该立即修正

          逻辑的错误:

    2、为何要异常处理

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

    3、如何异常处理

     1 # 异常处理的单分支
     2 try:
     3     print('=====1')
     4     print('=====2')
     5     print('=====3')
     6     d = {'x': 1, 'y': 2}
     7     d['z']  # KeyError
     8     print('=====4')
     9     l = [1, 2, 3]
    10     l[1000]  # IndexError
    11     print('=====5')
    12 except IndexError:
    13     print('IndexError')
    14 
    15 print('other code')
    16 
    17 异常处理的多分支
    18 try:
    19     print('=====1')
    20     print('=====2')
    21     print('=====3')
    22     d = {'x': 1, 'y': 2}
    23     d['z']  # KeyError
    24     print('=====4')
    25     l = [1, 2, 3]
    26     l[1000]  # IndexError
    27     print('=====5')
    28 except KeyError as e:
    29     print('KeyError',e)
    30 except IndexError as e:
    31     print('IndexError',e)
    32 
    33 
    34 print('other code')


    元类

    对象tea1是调用OldboyTeacher类得到的,如果说一切皆对象,那么OldboyTeacher也是一个对象,只要是对象
    都是调用一个类实例化得到的,即OldboyTeacher=元类(...),内置的元类是type

     1 class OldboyStudent:
     2     def __init__(self,name,age,sex):
     3         self.name=name
     4         self.age=age
     5         self.sex=sex
     6 
     7     def score(self):
     8         print('%s is scoring' %self.name)
     9 
    10 tea1=OldboyTeacher('nuanxin',21,'male')
    11 # print(type(tea1))
    12 print(type(OldboyTeacher))

    自定义类的三个关键组成部分:

     1 # 不依赖class关键字创建一个自定义类
     2 # 1. 拿到类名
     3 class_name='OldboyStydent'
     4 #2. 拿到类的基类们:(object,)
     5 class_bases=(object,)
     6 #3. 拿到类的名称空间
     7 class_dic={}
     8 class_body="""
     9 school = 'Oldboy'
    10 
    11 def __init__(self,name,age,sex):
    12     self.name=name
    13     self.age=age
    14     self.sex=sex
    15 
    16 def score(self):
    17     print('%s is scoring' %self.name)
    18 """
    19 exec(class_body,{},class_dic)
    20 print(class_dic)
    21 #4. 调用type得到自定义的类
    22 OldboyTeacher=type(class_name,class_bases,class_dic)
    23 
    24 print(OldboyTeacher)
    25 # print(OldboyTeacher.school)
    26 # print(OldboyTeacher.score)
    27 
    28 tea1=OldboyTeacher('nuanixn',20,'male')
    29 print(tea1.__dict__)
  • 相关阅读:
    MYSQL57密码策略修改
    dataSource' defined in class path resource [org/springframework/boot/autocon
    ubuntu14.04 red5
    hadoop中修改端口号
    FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to controller/192.168.1.183:9000. Exiting. java.io.IOExcep
    hadoop ssh 问题WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
    openstack安装dashboard后访问horizon出错 End of script output before headers: django.wsgi
    sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) Cannot add a NOT NULL column with default value NULL [SQL: u'ALTER TABLE address_scopes ADD COLUMN ip_version INTEGER NOT NULL']
    mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")
    OpenStack安装keyston 错误BError: (pymysql.err.InternalError) (1071, u‘Specified key was too long; max key length is 767 bytes‘) [SQL: u‘ CREATE TABLE migrate_ver
  • 原文地址:https://www.cnblogs.com/zedong/p/9542951.html
Copyright © 2020-2023  润新知