欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-14 19:17:54
1、类的约束 父类对子类某些功能的约束. python 中的两种约束: 1, 提取父类, 然后在父类中定义好方法, 该方法什么都不用干, 就通过主动抛出异常 raise NotImplementedError, 所有的子类必须重写此方法, 否则访问时就会抛出异常(推荐使用). 1 class Bas ......

1、类的约束

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

 python 中的两种约束:

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

python摸爬滚打之day19----类的约束, 异常处理
 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, 父类是一个抽象类, 在父类中给出一个抽象方法, 子类必须重写我父类中的抽象方法, 否则子类也是一个抽象类, 无法实例化.

python摸爬滚打之day19----类的约束, 异常处理
 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, 并将错误信息写进堆栈信息里, 日志记录时将错误信息提取出来,进行记录.

python摸爬滚打之day19----类的约束, 异常处理
 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("这没法算,没得算")
异常处理机制

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

python摸爬滚打之day19----类的约束, 异常处理
 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("其他错误")
自定义错误