约束
用来约束xx类的其派生类,保证派生类中必须编写有xxx方法,不然执行就会报错
Python中
语法:主动抛出异常
可以是 raise Exception(xxx)这个其实也是可以的,但不是很专业;专业的写法: raise NotImplendError(xxx)

1 class BaseMessage(object):
2 def send(self):
3 """
4 必须继承BaseMessage,然后其中必须编写send方法。用于完成具体业务逻辑。
5 """
6 raise NotImplementedError(".send() 必须被重写.")
7 # raise Exception(".send() 必须被重写.")
8 def func(self):
9 pass
10 def func_1(self):
11 pass
12 class Foo(BaseMessage):
13
14 def send(self):
15 """这个send方法时必须要有的,因其父类约束了此方法,其他方法可有可无"""
16 pass
Java和C#中
接口,接口中不允许在方法内部写代码,只能约束继承它的类必须实现接口中定义的所有方法,一个类可以实现多个接口

interface IFoo: # 接口 # 方法内部不可写代码
def f1(self, x1): # 接口中的方法
pass
def f2(self, x1): # 接口中方法
pass
interface IBar: # 接口
def f3(self, x1): #接口中的方法
pass
def f4(self, x1): # 接口中的方法
pass
class Foo(IFoo, IBar): # 实现了2个接口,上述2个接口中的方法都要在这实现
def f1(self, x1):
pass
def f2(self, x1):
pass
def f3(self, x1):
pass
def f4(self, x1):
pass
抽象类和抽象方法约束
需要引入库abc中ABCmeta类和abstractmethod类
定义:
抽象类:class 类(metaclass = ABCMeta)或__metaclass__ = ABCMeta
抽象方法:方法上方加@abstractmethod装饰器

from abc import ABCMeta,abstractmethod # 引入模块
class Base(metaclass=ABCMeta): # 抽象类
def f1(self):
print(123)
@abstractmethod
def f2(self): # 抽象方法
pass
class Foo(Base):
def f2(self): # 必须要有
print(666)
应用场景:多个类,内部都必须有某些方法时,需要是有基类+异常进行约束
自定义异常处理
定义异常类+主动抛出异常+捕获异常

1 # 自定义异常类 2 class MyException(Exception): 3 def __init__(self, code, msg): 4 self.code = code 5 self.msg = msg 6 7 try: 8 # 主动抛出异常 9 raise MyException(1000, '操作异常') 10 11 except KeyError as obj: 12 print(obj, 1111) 13 except MyException as obj: # 捕获异常 14 print(obj, 2222) 15 except Exception as obj: 16 print(obj, 3333)

1 import os
2
3 class ExistsError(Exception):
4 pass
5
6 class KeyInvalidError(Exception):
7 pass
8
9 def new_func(path,prev):
10 """
11 去path路径的文件中,找到前缀为prev的一行数据,获取数据并返回给调用者。
12 1000,成功
13 1001,文件不存在
14 1002,关键字为空
15 1003,未知错误
16 ...
17 :return:
18 """
19 response = {'code':1000,'data':None}
20 try:
21 if not os.path.exists(path):
22 raise ExistsError() # 主动抛出异常1
23
24 if not prev:
25 raise KeyInvalidError() # 主动抛出异常2
26 pass
27 except ExistsError as e: # 捕捉异常
28 response['code'] = 1001
29 response['data'] = '文件不存在'
30 except KeyInvalidError as e:
31 response['code'] = 1002
32 response['data'] = '关键字为空'
33 except Exception as e:
34 response['code'] = 1003
35 response['data'] = '未知错误'
36 return response
37
38
39 def func(path,prev):
40 """
41 去path路径的文件中,找到前缀为prev的一行数据,获取数据并返回给调用者。
42 1000,成功
43 1001,文件不存在
44 1002,关键字为空
45 1003,未知错误
46 ...
47 :return:
48 """
49 response = {'code':1000,'data':None}
50 try:
51 if not os.path.exists(path):
52 response['code'] = 1001
53 response['data'] = '文件不存在'
54 return response
55 if not prev:
56 response['code'] = 1002
57 response['data'] = '关键字为空'
58 return response
59 pass
60 except Exception as e:
61 response['code'] = 1003
62 response['data'] = '未知错误'
63 return response
来源:http://www.cnblogs.com/--kai/p/9566882.html
