5.24—029—周五

今日所学内容

    一、元类

    二、单列

    三、异常

    四、断言 assert

补充 exec 与 eval

  exec 用于执行字符串形式的python代码 只要符合python都能执行 ,并且可以指定将执行产生的名字放入某个名称空间

  eval 用于执行简单的表达式,不能有任何的特殊语法

一、元类

1、什么是元类:用于产生类的类,称之为元类。翻译为:metaclass

      类class 是通过 type 这个类实例化

  type的两种用法:

    type( 类名,父类元组,名称空间字典)  #返回一个新的类
    type(对象)              #将会返回这个对象的类型

  手动调用type来实例化产生一个类  这个类由三个部分组成

    1.类的名称          我是谁

    2.类的父类们(元组)     我从哪里来

    3.类的名称空间(字典)    我有什么

   所以:我们可以总结出 当我们用class定义一个类时,解释器会自动调用type来完成类的实例化

2、元类的作用

  当我们需要高度定制类时,如限制类名必须大写开头,类的属性需要全小写时 等其它情况时,需要使用元类,但是元类type中的代码 无法被修改 ,只能通过继承 type 创建新的元类 metaclass,通过覆盖__init__来完成对类的限制

  如何自定义元类

    class MyMetaClass(type):

      pass

  使用自定义元类

    class Person(metaclass=MyMetaClass):
      pass

3、元类中三种方法 重点

  1) __init__ 方法 ——重点—— 用于实例化 类

    实例化类时会自动执行类中的__init__方法, 类也是对象 ,在实例化类时会自动执元类中的__init__方法

    并且传入类的三个必要参数  类的名字  父类们(元组)  名称空间(字典)

    当然会自动传入类对象本身作为第一个参数

  2)__new__ 方法 —— 用于实例化 类

    元类中的__new__方法会在创建类对象时执行,并且先于 __init__ 方法执行

    作用是创建一个类对象

    执行__new__的过程:

    (1)执行MyMetaClass的__new__方法 拿到一个类对象

    (2)执行MyMetaClass的__init__ 方法 传入类对象以及其他的属性 ,进行初始化

    注意:如果覆盖了__new__ 需要调用type中的__new__并返回执行结果

  3)__call__ 方法 —— 重点 —— 用于通过类实例化 对象

    元类中的 call方法会在调用类,实例化类对象时执行,

    用于控制对象的创建过程

  4)元类中三种方法的总结:

    (1)__init__ 与 __new__ 方法的区别:

      __init__ 与 __new__在使用时可以定制类,有相同的效果,只是程序运行过程中,在调用__init__ 方法之前,类对象已经通过__new__ 创建完成了,所以如果对性能要求比较高的话,可以选择在__new__ 中完成定制,就是说创建类时传入数据与规定的有差别,直接返回,就不再创建类,可以节约内存空间

    (2) 是创建类对象时还会执行 __new__  __init__

二、元类实现单例

1、什么是单例:

   通过一个类只能实例化一个对象,那么这个类就称为单例类

2、单例的好处:

  当某个类的所有对象的属性与行为完全一样时,为避免重复创建对象,浪费资源

三、异常

1、什么是异常

  异常是指 程序运行过程中发生的非正常情况,是一个错误发生时的信号

  异常如果没有被正确处理的话,将会导致程序执行被终止,导致用户的体验感非常差,可能造成严重的后果

  处理异常的目的就是提高程序的健壮性、稳定性

2、异常的分类

  1)语法检测异常:

    即python解释器在执行代码前,会先检查程序语法,语法检查通过后才会开始执行代码,作为一个合格的程序员 不应该出现语法异常低级错误

  2)运行时异常:

    已经通过语法检测,开始执行代码,执行过程中发生异常 称之为运行时异常

3、发生异常时,返回异常的组成

    Traceback  是异常追踪信息  用于展示错误发生的具体位置 以及调用的过程
      其中包括 错误发生的模块  文件路径  行号  函数名称  具体的代码
    最后一行  前面是 错误的类型  
           后面是 错误的详细信息  在查找错误时,主要参考的就是 详细信息

  常见的异常的报错类型

    TypeError: 'int' object is not subscriptable           对象不能被切片  
    TypeError: 'list' object is not callable              对象不能被调用
    IndexError: list index out of range                  索引超出范围
    TypeError: 'builtin_function_or_method' object is not iterable   对象不能被迭代
    KeyError: 'xxx'                           不存在这个key
    FileNotFoundError: [Errno 2] No such file or directory: 'xxxxx'    文件找不到

4、异常处理

  1)什么是异常处理:

    异常发生后 如果不正确处理,将导致程序终止,我们必须尽量的避免这种情况发生

  2)处里异常需要掌握的语法

    try:

      可能会出现异常的代码 放到try里面

    except 具体异常类型 as e:  # 如果真的发生异常就执行except

      print(e)

  3)如何正确处理异常

    当发生异常 不是立马加 try 要先找出错误原因并解决它

    try 仅在 即使你知道为什么发生错误,但是你却无法避免

    Eg:你明确告诉用户 需要一个正确文件路径 然而用户依然传入了错误的路径

    Eg:在socket中   双方都要使用管道传输数据,但是如果一方有由于某些原因强行关闭了

      即使你知道原因也无法避免出错 那就只能 try 保证程序正常结束

    总结:能不加try 就不加try

  4)自定义异常类

    当系统提供异常的类,不能准确描述错误原因时,就需要自定义异常类,继承自Exception即可

  5)主动抛出异常

    什么时候需要主动抛出异常

      当我们把功能写好,给外界提供一个功能接口,但是使用者不按照相应的方式来使用,或者参数类型不正确等原因,导致功能无法正常执行时,就应该主动抛出异常

    主动抛出异常使用 raise 关键字后面可以跟任何 Exception的子类 或是 对象

四、断言 assert

  断言 其实可以理解为断定的意思,即非常肯定某个条件是成立的,

  条件是否成立其实也可以使用if来判断

  断言存在的目的就是 为了简化if 判断,作用同 if 一样

 

上一篇:029 字典的内置方法


下一篇:MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.问题解决