• 学习总结(二十七)


    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 判断而生的

  • 相关阅读:
    洛谷P2089 烤鸡
    HDU-1000 A+B Problem
    《新标准C++程序设计》4.7-4.9(C++学习笔记17)
    《新标准C++程序设计》4.6(C++学习笔记16)
    面向对象程序设计寒假作业3
    《新标准C++程序设计》4.5(C++学习笔记15)
    《新标准C++程序设计》4.4(C++学习笔记14)
    《新标准C++程序设计》4.2-4.3(C++学习笔记13)
    洛谷题解P1047 校门外的树
    [lr] 矫正白平衡
  • 原文地址:https://www.cnblogs.com/xzcvblogs/p/10920002.html
Copyright © 2020-2023  润新知