面向对象-类的归一化设计

 

Python面向对象中的abc模块为我们提供了一种抽象类的归一化设计,把抽象类作为父类可以限制子类必须实现某些方法。
具体实现的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import abc

class Father(metaclass=abc.ABCMeta):

@abc.abstractmethod
def run(self):
pass

class Son(Father):
pass

if __name__ == '__main__':
son = Son()

抽象类Father在定义的时候指定其元类为abc.ABCMeta,里面的run方法用装饰器abc.abstractmethod装饰,这样所有继承它的子类就必须实现run这个方法。
上述代码中Son类继承了Father类但是没有实现其父类的run方法,在Son类实例化对象的时候会抛出下列异常:

1
TypeError: Can't instantiate abstract class Son with abstract methods run

我们在子类中必须实现run方法才能使程序正常运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import abc

class Father(metaclass=abc.ABCMeta):

@abc.abstractmethod
def run(self):
pass

class Son(Father):
def run(self):
return 'run'

if __name__ == '__main__':
son = Son()

异常处理的方式实现归一化效果

利用abc模块实现的归一化设计是在子类实例化的时候进行判断的,这种方式难免有些强制,我平时比较常用异常处理的方式:

1
2
3
4
5
6
7
8
9
10
11
12
class Father(object):

def run(self):
raise NotImplementedError("must have method run()")

class Son(Father):
pass

if __name__ == '__main__':

son = Son()
son.run()

从上面的代码可以看出:在实例化son对象的时候不会发生异常,但是在son试图调用run方法的时候,根据对象的属性与方法的查找顺序的原理可知,由于Son类本身没有实现run方法,只能从父类中去找,而父类的run方法会直接抛出异常!同样也实现了强制子类必须定义run方法的效果。

posted @ 2022-04-23 22:26  AnthonyWang  阅读(78)  评论(0)    收藏  举报