day027学习笔记

内置方法

  • 魔法方法

    • __所包围的一些python自带的方法
    • 某种情况下会被自动调用
  • 类中内置方法

    class Person:
        def __new__(cls, *args, **kwargs):
            print("new创建对象的方法")
            return object.__new__(cls)
        def __init__(self):
            self.name = 1
            print("用来初始化对象,构造方法或构造器")
    
        def __del__(self): #在程序结束时会被垃圾回收机制自动调用以释放内存
            print("析构器,析构方法,在对象被删除时,自动调用")
    
        def __len__(self):
            return 666
    
        def __str__(self):
            return "人类对象,有{}{}方法{}{}对象"
    
    xiaoming = Person()
    del xiaoming #调用__del__方法
    
    lis = [1,2,3,4,5,6,7,8]
    print(len(lis)) #8 调用list类的__len__方法
    print(len(xiaoming)) #666  调用当前类的__len__方法
    
    print(xiaoming) #调用当前类的__str__方法
    
    • __new__(cls[, ...]) 一个对象实例化的时候所调用的第一个方法

    • __init__(self[, ...]) 构造器,当一个实例被创建的时候调用的初始化方法

    • __del__(self) 析构器,当一个实例被销毁的时候调用的方法(建议不要重写)

    • __len__ 通过len(obj)调用,返回值必须设置为int类型(也可以返回其它数据类型-函数失效)

    • __hash__ 通过hash(obj)调用(一种消息摘要算法) --获取取一个对象(非可变数据类型)的哈希值

    • __str__ 打印对象时调用print()

    • __eq__ 比较两个对象,判断两个对象是否相同,设置规则,调用前者的规则方法

      class A:
          def __init__(self):
              self.name = "xiaoming"
              self.age = 20
      
          def __eq__(self, other):
              if self.name == other.name and self.age == other.age:
                  return True
              else:
                  return False
      
      class B:
          def __init__(self):
              self.name = "xiaoming"
              self.age = 20
      a =A()
      b = B()
      print(a == b)  #调用前者的eq方法
      b.name = 111
      print(a == b)
      

异常

  • 概念

    • 异常类-Exception
    • 异常-在程序执行过程中发生的影响程序正常执行的事件(对象)
  • 抛出异常

    • raise语句显式的抛出异常
    • Python解释器自己检测到异常并引发它(在Python无法正常处理程序时)
  • 常见异常

    • SyntaxError语法错误
    • IndentationError多打一个空格
    • NameError 使用一个还未被赋予对象的变量
    • TypeError 传入对象类型与要求的不符合 (int + str)
    • IOError 输入/输出异常;基本上是无法打开文件
    • ImportError 无法引入模块或包;基本上是路径问题或名称错误
    • IndexError 下标索引超出序列边界
    • KeyError 试图访问字典里不存在的键
  • 异常处理

    用特定代码来捕捉异常(与当前程序逻辑无关),使程序能顺序执行

    • 方式1-if条件判断,根据结果进行处理,可读性较差,代码冗长

    • 方式2-try except

      try:
          # 被检测的代码块
      except 异常类型: #发生异常后接收
          # 接收异常后的处理方式
      
      • 单分支:已知异常类型,用特定异常去接收

        try:
            print(1/0)
        except ZeroDivisionError:#不匹配无法捕捉则会报错
            print("0不能作为除数")
        print("后续语句")
        
      • 多分支:不同异常不同处理方式(但是一次只接收一个异常)

        a = [1,2,3]
        try:
            print(1/0)  #捕获到异常就抛出
            print(a[5]) #不会被捕捉的异常
        except ZeroDivisionError:
            print("除0错误")
        except IndexError:
            print("索引错误")
        print("后续语句")
        >>>除0错误
        >>>后续语句
        
        使用一个except捕捉多个异常
        def model_exception(x,y):
          try:
            b = name
            a =x/y
          except(ZeroDivisionError,NameError,TypeError):
            print('one of ZeroDivisionError or NameError or TypeError happend')
        
        #调用函数结果
        model_exception(2,0)
        >>>one of ZeroDivisionError or NameError or TypeError happend
        
      • 万能异常:捕捉Exception类中有的异常并查看

        try:
            print(a[5])
        except Exception as e: #所有异常的处理方式是一样的
            print(e)
        
        print("后续语句")
        >>>name 'a' is not defined
        >>>后续语句
        
      • 多分支+万能异常 :已知异常用特定方法处理,最后剩下的异常统一使用万能异常处理

        dic = {1: "login",2: "register",3: "dariy",4: "article",5: "comment"}
        print('''欢迎访问博客园系统: 1,登录 2,注册 3,访问日记页面 4,访问文章页面 5,访问评论页面''')
        try:
            choice = int(input('请输入:'))
            print(dic[choice])
        except ValueError:
            print('请输入数字....')
        except KeyError:
            print('您输入的选项超出范围...')
        except Exception as e:
            print(e)
        
      • try...except...else组合 :有异常就不执行else代码

        a = [1,2,3]
        try:
            print(1/1)
            print(a[1])
        except ZeroDivisionError:
            print("除0错误")
        else:#try后面的语句,没有任何异常,执行else后的内容
            print("else")
        >>>1.0
        >>>2
        >>>else
        
      • try...except...finally组合:最后一定要执行finally后的语句块 (无论是否出现异常或异常捕捉到与否)(清理行为)

        a = [1,2,3]
        try:
            print(1/1)
            print(a[9])
        except ZeroDivisionError:
            print("除0错误")
        else:#else try后面的语句,没有任何异常,执行else后的内容
            print("else")
        finally:#没捕获到也一定会执行
            print("肯定执行finally")
        print("后续语句")
        
        • 函数中,finally会在return之前先执行 (理解为独立的声明-一定执行)

          def func():
              try:
                  return 1
              finally:
                  print('finally')
          func()
          >>>finally
          
        • finally应用场景:关闭文件的链接,数据等链接时,需要用到finally

          f = open('file',encoding='utf-8')
          try:
          	'''各种操作'''
          	print(f.read())
          	'''但是发生错误了, 此时没关闭文件句柄,所以'''
          finally:
          	f.close()#无论是否正常操作最后都要关闭文件
          
        • 循环中

          while 1:
              try:
                  break
              finally:
                  print('finally')
          >>>finally
          
        • finally总结:是做收尾工作

    • 方式3:主动发出异常

      raise TypeError('类型错误')

      raise Exception("类型错误")
      
    • 方式4: assert 断言,只要assert后面的代码不成立,直接报错

      name = "小明"
      print("1")
      print("1")
      assert name == "小明1" #若为False后面不再执行
      print("1")
      print("1")
      print("1")
      
    • 方式5:自定义异常

      通过继承eException类,定义新的异常类

      class Wodingyideyichang(Exception):
          value = "你中了我定义的异常"
      try:
          raise Wodingyideyichang()
      except Wodingyideyichang as e:
          print(e.value)
      >>>你中了我定义的异常
      
posted @ 2019-10-14 21:52  寂静四月  阅读(103)  评论(0)    收藏  举报