• python摸爬滚打之day19----类的约束, 异常处理


    1、类的约束

      父类对子类某些功能的约束.

     python 中的两种约束:

      1, 提取父类, 然后在父类中定义好方法, 该方法什么都不用干, 就通过主动抛出异常 raise NotImplementedError, 所有的子类必须重写此方法, 否则访问时就会抛出异常(推荐使用). 

     1 class Base:
     2     def login(self):
     3         raise NotImplementedError("%s的这个对象的login功能没有实现" %(self.name))
     4 
     5 class Admin(Base):
     6     def __init__(self,name):
     7         self.name = name
     8     def login(self):            # 重写login方法,就直接运行自己类里面的login()方法.
     9         print("login登录")
    10 
    11 class Root(Base):
    12     def __init__(self,name):
    13         self.name = name
    14     def denglu(self):           # 没有重写login()方法,只能运行父类的login, 然后父类里login()抛异常
    15         print("root登录")
    16 
    17 class Normal(Base):
    18     def __init__(self,name):
    19         self.name = name
    20     def login(self):
    21         print("normal登录")
    22 
    23 def test(obj):
    24     obj.login()
    25 
    26 a = Admin("admin")
    27 r = Root("root")
    28 n = Normal("normal")
    29 test(a)
    30 test(r)
    31 test(n)
    父类抛异常约束

      2, 父类是一个抽象类, 在父类中给出一个抽象方法, 子类必须重写我父类中的抽象方法, 否则子类也是一个抽象类, 无法实例化.

     1 from abc import ABCMeta,abstractmethod
     2 class Fruit(metaclass=ABCMeta):
     3     @abstractmethod
     4     def color(self):
     5         pass
     6 
     7 class Peach(Fruit):
     8     def color(self):        # 在子类中必须重写抽象父类中的抽象方法, 否则子类也不会实例化对象
     9         print("桃子是桃红色的")
    10 
    11 class Apple(Fruit):
    12     def yanse(self):
    13         print("苹果是苹果金的")
    14 
    15 def color(obj):
    16     obj.color()
    17 
    18 f = Fruit()     # TypeError: Can't instantiate abstract class Fruit with abstract methods color
    19                 # Fruit是一个抽象类, 对于抽象类是不能实例化的.
    20 
    21 p = Peach()
    22 a = Apple()    # 没有重写父类的抽象方法,所以Apple类也是一个抽象类, 无法实例化对象
    23 color(p)
    24 color(a)
    抽象父类和抽象方法约束

    2、异常处理

      2.1  主动抛出异常:  raise Exception("....出错") ----> 实例化一个异常对象并主动抛出, raise后面的代码不执行.

      2.2  结构: 

         try:

          可能出错的代码块

         except  错误类1  as 异常别名:

          出错了怎么办...

            except  错误类2  as 别名:

          出错了怎么办...

          else:

          不出措时执行的代码

         finally:

          收尾代码

      异常处理机制: 代码在运行时, 如果出错系统会直接抛出异常对象, 被except拦截, 并把接受到的错误对象赋值给e, 并将错误信息写进堆栈信息里, 日志记录时将错误信息提取出来,进行记录.

     1 import traceback     
     2 # 异常处理
     3 def calc(a,b):
     4     if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
     5         return a+b
     6     else:
     7         raise Exception("你给的参数有问题")   #主动抛出异常对象, Exception("......")是Exception这个类的实例化结果.
     8                                               # 在出错时直接将错误拦截,强制将错误对象按给的("......")实例化在pycharm展示.
     9 try:
    10     print(calc(5,"35"))
    11 except Exception as e:      # e,是捕获的错误对象, 里面封装这错误信息.  
    12     ret = traceback.format_exc()   # 从堆栈信息里调取错误信息, 一般将其写进日志.
    13     print(ret)
    14     print("这没法算,没得算")
    异常处理机制

      当一些错误信息不能满足时, 可以自定义错误类(极其不推荐)

     1 # 自定义错误
     2 class AgeException(Exception):
     3     pass
     4 
     5 class Person:
     6     def __init__(self,name,age):
     7         self.name = name
     8         self.age = age
     9     def watch_movie(self):
    10         if self.age < 18:
    11             raise AgeException("年龄未满十八岁")
    12         else:
    13             print("史上最血腥最十八禁的电影放映开始...")
    14 while 1:
    15     try:
    16         name = input("姓名:")
    17         age = int(input("年龄:"))
    18         obj = Person(name,age)
    19         obj.watch_movie()
    20     except AgeException as e:
    21         print("你年龄都未满18岁看个毛")
    22     except ValueError as e:
    23         print("你不是年龄的数字能和18相比吗")
    24     except Exception as e:
    25         print("其他错误")
    自定义错误
  • 相关阅读:
    SharePoint SSS(Security Store Service)服务-PowerShell
    SharePoint BDC(Business Data Connectivity)服务-PowerShell
    win32编辑控件字体
    创建选项卡控件
    利用VkKeyScanA判断大写字母
    使用powershell的remove
    x86和x64下指针的大小
    不使用C库函数(Sprintf)将void* 指针转换为十六进制字符串
    使用pycharm,配置环境
    使用python获得屏幕截图并保存为位图文件
  • 原文地址:https://www.cnblogs.com/bk9527/p/9955945.html
Copyright © 2020-2023  润新知