学习总结(二十七)

1.类的组成:

           一个类由三个部分组成

                  1.类的名称 我是谁

                   2.类的父类们 我从哪里来

                   3.类的名称空间 我有什么

2.元类:

     1)什么是元类:

                 元类就是用来创建类的一个对象(方法),类的本身就是实例化后的元类,type方法就是python背后创建所有类的一个元类,

      2)元类可以干什么:

               元类可以通过限制类来满足某些条件或者需求,元类可以自动的改变类

      3)怎么使用元类:

               type(类名,父类元组,名称空间字典)  #返回一个新的类

               type(对象)  #将会返回这个对象的类型

                class 父类(type) 继承元类

                class 子类(metaclass=父类) 指定要继承的父类

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

       

3.元类常用方法       

          1)  在继承元类中的父类重写 __new__方法创建一个类对象,

           2)  执行__init__方法会在父类中得到子类的类对象,类属性,类方法,子类继承其他类的对象

              案例

class MytypeMetaClass(type):

    def __init__(self,a,b,c):
        super().__init__(a,b,c)
        print(a)   # 继承类的名
        print(b)   #显示继承类,没有继承类就显示空元组
        print(c)   #变量和方法的以字典形式显示

class person(object,metaclass=MytypeMetaClass):
    name="谢忱"
    age=123456
    def sube(self):

        print("suber")

 person()

  

           3)__call__方法,该方法会在传参给类的时候调用

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

4.单例设计模式

    1)什么是单例设计模式   

             某个类如果只有一个实例对象,那么该类成为单例类

      2)单列的好处

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

  案例一:

class SingletonMetaClass(type):
    #创建类时会执init 在这为每个类设置一个obj属性 默认为None
    def __init__(self,a,b,c):
        super().__init__(a,b,c)
        self.obj = None
    
    # 当类要创建对象时会执行 该方法
    def __call__(self, *args, **kwargs):
         # 判断这个类 如果已经有实例了就直接返回 从而实现单例
        if self.obj:
            return self.obj

        # 没有则创建新的实例并保存到类中
        obj = type.__call__(self,*args,**kwargs)
        self.obj = obj
        return obj

  案例二:

class HealthCheck:
    _instance=None
    def __new__(cls, *args, **kwargs):
        if not HealthCheck._instance:
             HealthCheck._instance=super(HealthCheck,cls).__new__(cls,*args,**kwargs)
            return HealthCheck._instance
    # 这可以作为一个列表
    def __init__(self):
        self.servers=[]

  

5.异常

     1)什么是异常

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

            异常如果没有被正确处理的话,将导致程序被终止,这对于用户体验是非常差的,可能导致严重的后果       

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

     

       2)异常的分类 

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'  文件找不到

  

      3)异常的组成:

Traceback (most recent call last):
  File "F:/python8期/课堂内容/day29/11.常见异常.py", line 22, in <module>
    with open("xxxxx") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'xxxxx'
        
Traceback    是异常追踪信息   用于展示错误发生的具体位置 以及调用的过程
其中 包括了 错误发生的模块  文件路径   行号  函数名称  具体的代码

最后一行  前面是错误的类型  
		 后面 错误的详细信息   在查找错误时 主要参考的就是详细信息

  4)异常处理

             语法:

                 try:

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

                  except 具体异常类型 as e:

                  如果真的发生异常就执行except

         5)如何正常处理异常   

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

  2. try 仅在 即使你知道为什么发生错误 ,但是你却无法避免 例如 你明确告诉用户 需要一个正确文件路径 然而用户依然传入了错误的路径

    如 socket 双方都要使用管道 ,但是如果一方有由于某些原因强行关闭了 ,即使你知道原因也无法避免出错 那就只能try 保证程序正常结束

    总结一句话:能不加try 就不加try

          6)自定义异常

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

               class MyException(Exception):

                             pass

           7) 主动抛出异常

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

                         当我们做功能的提供者,给外界提供一个功能接口

                         但是使用者不按照相应的方式来使用,或者参数类型不正确等原因,导致功能无法正常执行时,就应该主动抛出异常,主动抛                          出异常使用raise 关键字后面可以跟任何Exception的子类 或是 对象

                      raise MyException

                       raise MyException("错误具体原因!")

  

 6. 断言assert  

            断言 其实可以理解为断定的意思

            即非常肯定某个条件是成立的

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

             其存在的目的就是 为了简化if 判断而生的

原文地址:https://www.cnblogs.com/xzcvblogs/p/10920002.html