第二十一天

今日内容

一、多态与多态性

1.1多态

  多态:同一种事物有多种形态
  主要不是用来让子类重用代码的,而是统一多个子类使用同种功能的方法
  例:
  class Animal:
      def talk(self):
          pass

  class Dog(Animal):
      def talk(self):
          print("汪汪汪")

  class Cut(Animal):
      def talk(self):
          print("喵喵喵")

  class Pig(Animal):
      def talk(self):
          print("哼哼哼")

  obj1 = Dog()
  obj2 = Cut()
  obj3 = Pig()

1.2鸭子类型

  本质其实不是继承同一个父类的功能,而是为了统一标准
  1、可以不采用继承方法,而是用协商的方式让对象的功能名统一化

  2、使用abc模块,但凡继承这个父类的子类们内必须有与父类同名的功能
  如果没有的话子类在实例化时会报错
  import abc
  class Animal(metaclass=abc.ABCMeta):
      @abc.abstractmethod
      def talk(self):
          pass

二、面向对象高级

2.1内置函数

  1、isinstance:判断一个对象是否是一个类的实例
  例:
  class Foo:
      pass
  obj = Foo()
  print(isinstance(obj,Foo))

  2、issubclass:判断一个类是否是另一个类的子类
  例:
  print(issubclass(Foo,object))

2.2内置方法

  __开头并且__结尾的属性会在满足某种条件下自动触发
  例一、
  class People:
      def __init__(self,name,age):
          self.name = name
          self.age = age

      def __str__(self):       #打印对象时,自动触发__str__内代码运行,
          return f"{self.name}:{self.age}"  #并把返回值交给print打印,返回值必须是字符串类型

  obj = People("xxx",18)
  print(obj)

  例二、
  class People:
      def __init__(self,name,age):
          self.name = name
          self.age = age
          self.f = open("a.txt",mode="wt",encoding="utf-8")

      def __del__(self):    #在删除对象时,会自动触发__del__内代码,包括程序结束时也会触发
          self.f.close()  #主要是用来完成资源回收的

  obj = People("xxx",18)

三、反射

3.1反射

  通过字符串来映射到真正的功能身上
  class People():
      country = "china"
      def __init__(self,name,age):
          self.name = name
          self.age = age

  obj = People("xxx",18)

  print(hasattr(obj,"country"))      #判断字符串内容是否能被obj调用,即obj.country能不能被调用

  res = getattr(obj,"country")       #拿obj内的属性,即obj.country的内容
  print(res)


  setattr(obj,"xxx",1111)         #为obj添加一个属性,即 obj.xxx = 1111
  print(obj.xxx)

  delattr(obj,"name")           #删除obj内的属性
  print(obj.name)

四、异常处理

4.1异常处理

  '''
  1、什么是异常:
      异常是错误发出的信号
      程序一旦出错就会产生一个异常
      如果该异常没有被处理,该异常就会被抛出。程序的运行也随机终止

      错误分成两种:
          1、语法错误
          2、逻辑错误
  2、为何要处理异常:
      不应该让程序出现崩溃

  3、如何处理异常:
      1、语法错误:
          程序运行前就必须改正确
      2、逻辑错误:
          针对可以控制的逻辑错误,应该直接在代码层面解决
          正对不可控制的逻辑错误,应该采用try...exceot...的方式解决

  4、try...execpet一种异常产生之后的补救措施
  tyr:
      被检测的代码块1
      被检测的代码块2
      被检测的代码块3
  execpet 异常的类型1 as e:
      处理异常的代码
  execpet 异常的类型2 as e:
      处理异常的代码
  execpet 异常的类型3 as e:
      处理异常的代码
  except (异常的类型4,异常的类型5,异常的类型6)as e:    #如果是异常4,5,6都运行这段代码
      处理异常的代码
  except Exception:         #都不属于以上所有异常才运行
      处理异常的代码
  else:
      没有发生异常时执行的代码
  finally:
      无论有没有异常都会执行该代码,通常用来惊醒回收资源的操作
  '''
  
  例1:匹配到了异常程序并不会崩溃
  print("start...")
  try:
      print(111)
      print(222)
      l = [11,22,33]
      l[100]
      print(333)
  except IndexError as e:
      print(e)
  print("end...")

  例2:没有匹配到异常运行到逻辑错误时程序照样会崩溃
  print("start...")
  try:
      print(111)
      print(222)
      l = [11,22,33]
      l[100]
      print(333)
  except KeyboardInterrupt as e:
      print(e)
  print("end...")

4.2常见异常类型

  1、IndexError:列表索引异常
  2、KeyError:字典取值异常
  3、AttributeError:对象调用不存在异常
  4、ValueError:值出现异常
  5、ZeroDivisionError:数学层面异常
  6、TypeError:函数参数异常
  7、NameEooro:名字没有定义异常

4.3主动抛出异常的三种方式

  1、断言:主要用来测试代码
  判断目标代码块达没达到想要的目的,
  如果达到了就继续运行下方代码,如果没达到就报错
  例:
  l = [111,222]
  assert len(l) == 3    #判断条件是否成立,成立就当不存在,不成立就报错
  print("后续代码")


  2、raise:主动抛出异常
  为用户定制规则时用户不遵从可以主动抛出异常
  raise IndexError("索引错误")
          自己选择抛出的错误类型


  3、自定义异常
  例:
  class Permission(BaseException):
      pass
                  #自己填写异常内容
  raise Permission("权限异常")
posted @ 2021-01-13 21:16  抓鬼少年  阅读(82)  评论(0编辑  收藏  举报