前言
最近在看设计模式。在学习初期一直有一个问题困扰着我,那就是UML类图
中的各种结构用python代码是如何实现的?这个在初期可以说是深深的困扰着我的设计模式
学习之路。下面我将介绍一下我自己总结的实现,如果有错误也希望各位给指出,不胜感激。
工具介绍
本文的UML图采用Enterprise Architect绘制。
Python版本2.7.12
(在用了Enterprise Architect 后才知道他有从类图导出代码的功能,/捂脸
早知道就用这个学习各种结构的实现了。文末有介绍如何用Enterprise Architect 导出代码。)
类图
类图是由类和类之间的连接关系构成。
类我们这里只介绍类和抽象类。
连接关系我们介绍泛化(generalization)、实现(realize)、聚合(aggregation)、组合(compositon)、关联(assocation)和依赖(dependency)共六种。
类
抽象类(java中接口)
图示
接口在UML中的图形为
可以看到再其上半部分有一个interface的表示。在接口中一般只给出接口的定义
而实现一般放在子类和实现。
代码
在python中本事是没有接口和抽象类这一概念的,但是可以通过abc(Abstract Base Class)这个python库来实现。或者是通过抛出NotImplementedError这个异常来实现。
通过abc模块来实现
from abc import ABCMeta, abstractmethod, abstractproperty
class Drawable:
__metaclass__ = ABCMeta
@abstractproperty
def size(self):
pass
@abstractmethod
def draw(self, x, y, scale=1.0):
pass
class Cicle(Drawable):
def size(self):
print 'Cicle'
def draw(self, x, y, scale=1.0):
print str(x*y*scale)
c = Cicle()
如果在子类里面没有实现方法,当实例化子类的时候会报错。abc模块的具体