zoukankan      html  css  js  c++  java
  • 学习总结(二十七)

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

  • 相关阅读:
    The formatter threw an exception while trying to deserialize the message in WCF
    通过Web Deploy方式部署WCF
    The Managed Metadata Service or Connection is currently not available
    How to create Managed Metadata Column
    冒泡算法
    asp.net core 实战项目(一)——ef core的使用
    Vue学习笔记入门篇——安装及常用指令介绍
    Vue学习笔记入门篇——数据及DOM
    Vue学习笔记目录
    Chart.js在Laravel项目中的应用
  • 原文地址:https://www.cnblogs.com/xzcvblogs/p/10920002.html
Copyright © 2011-2022 走看看