博客园

4、面向对象高级

多态与多态性

内置方法

反射

异常处理

💣💣💣💣💣多态与多态性💣💣💣💣💣

多态--同一种事物有多种形态

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

  class Cat:
      def talk(self):
          print('喵喵!')

  class Pig:
      def talk(self):
          print("哼哼哼!")
  obj1 = Dog()
  obj2 = Cat()
  obj3 = Pig()
  obj1.talk()>>>>>>汪汪汪"

强制定义def talk 若不是就报错

  class Animal(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def talk(self):
        pass

💣💣💣💣💣内置方法💣💣💣💣💣

  class Foo:
        pass
  obj = Foo()
  print(isinstance(obj,Foo)  ininstance 判断类型 判断实例
  print(isinstance([1,2,3],list))
  print(isinstance(Foo,object))------> True

__开头__并且结尾的属性会在满足某种条件下自动触发

str

  class People:
        def __init__(self,name,age):
              self.name = name
              self.age = age
        def __str__(self):         # 可直接打印
              return"<%s:%s>"(self.name,self.age)
  obj = People('liu',18)
  print(obj)       #<egon:19>

del

  class People:
        def__init__(self,name,age):
              self.name = name
              self.age =age
              self.f = open('a.txt',node = 'rt',encoding = 'utf-8')
        def __del__(self):
              self.f.close()   # 回收资源
  obj = People('liu',18)
  del obj

💣💣💣💣💣反射💣💣💣💣💣

  接收到一个文件不知道里面有啥,想要查找或者获取,就用到了反射
  class People:
        country = 'China'
        def __init__(self,name,age):
              self.name = name
              self.age = age
        def tell_info(self):
              print(self.name,self.age)
  obj = People('egon',18)

  print(dir(obj))     #查看类、对象的功能
  print(hasatter(obj,'country'))   = obj.country 查看有木有country

  method = getatter(obj,'tell_info')
  method         # 字符串方式调用 tell info

  setattr(obj,'xxx',111)
  print(obj.xxx)       === 111
  
  delatter(obj,'name')
  print(obj.name)       # 报错,已被删除
  print(hasattr(obj,'name')  # False 没有了 已被删除

💣💣💣💣💣异常处理💣💣💣💣💣

程序出错会导致异常,不处理会抛出终止程序的运行

  #语法异常------应该在程序运行前改正,一名合格的程序员不应该犯的错误
  #逻辑异常------尽量减少异常的发生,在代码层面解决,实在不可控,可以用try.....except

try...except 异常产生后的补救方法

  print('start...')
  try:
      被监测的代码块1
      被监测的代码块2
      被监测的代码块3
      被监测的代码块4
      被监测的代码块5
  except 异常的类型1 as e:
      处理异常的代码
  except 异常的类型2 as e:
      异常的代码
  except (异常的类型4,异常的类型5,异常的类型6) as e:
      处理异常的代码
  except Exception:                        # 兜底专用,接受所有异常报警
      处理异常的代码
  else:
      没有发生异常时要执行的代码
  finally:
      无论异常与否,都会执行该代码,通常用来进行回收资源的操作
  print('end...')

尽量少用try except 可比避免的用 if 逻辑判断

  #案例
  age = input(">>>: ").strip()
  if age.isdigit():      # 2、所以在这里加上个逻辑判断,
      age = int(age)     # 1、这里只有输入数字才能转int类型,若是用户输入非数字就会报错

      if age > 19:
          print('too big')
      elif age < 19:
          print('too small')
      else:
          print('you got it')
  else:
      print('必须输入数字')

用except接手异常,若是种类一样程序会被接收不会报异常,然后会继续运行try外层代码块

若不一样,程序仍然会报错 停止运行

  #案例一、
  print('start...')

  try:
      print(111)
      print(222)
      l=[11,22,33]
      l[100]  # 超出索引 
      print(3333)  # 不会运行
  except IndexError as e:  被indexError接收
      print(e)

  print('end...')  #正常运行
  
  #案例二、
  print('start...')

  try:
      print(111)
      print(222)
      l=[11,22,33]
      l[100]        # 索引错误异常  程序终止 
      print(3333)  #不会运行
  except KeyError as e:   keyError 无法接收  会仍然报异常
      print(e)

  print('end...')     # 外层代码也不能运行

断言 写完一阶段代码 可用来检测程序有没有达到自己想要的结果

  #案例一、
  l = [111,222]
  if len(l) != 3:
        raise Exception('必须达到三个值‘) # 报异常
  或可用
  assert len(l) == 3    # 若程序符合 则assert不起作用,否则异常,测试完程序应该删除assert
  
  #使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
  #在调试结束后,可以通过在包含 #include 的语句之前插入 #define NDEBUG 来禁用 assert 调用,示例代码如下:
  include 
  define NDEBUG 
  include

自定义异常

  class Permission(BaseException):
        def __init__(self,msg):
              self.msg = msg
  raise Permission('权限错误')
posted @ 2021-01-13 19:57  小刘学python  阅读(63)  评论(0编辑  收藏  举报