python 反射实现简单工厂

python反射、简单工厂模式
参见项目示例
github
gitee

简单工厂模式与Qt类反射2/简单工厂模式与Qt类反射2中介绍了简单工厂模式介绍、实现、优缺点以及借助Qt反射实现简单工厂模式,实现方式相当繁琐。
对于python这种自带反射的语言,简单工厂实现起来就相当简单了。

传统简单工厂

传统方式实现简单工厂通常如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

from Welcome.Welcome import Welcome
from Covid19Charts.Covid19Charts import Covid19Charts
from Covid19Map.Covid19Map import Covid19Map
# 注意1

class TabPane(QFrame):
def __init__(self, buttonNameTuple, parent=None):
# todo

def __pageFactory(self, name): # 注意2,此处name换成枚举更好
if name == 'Welcome':
return Welcome(self)
elif name == 'Covid19Charts':
return Covid19Charts(self)
elif name == 'Covid19Map':
return Covid19Map(self)
elif name == 'Covid19GeneralView':
return Covid19GeneralView(self)

通常的做法是import一堆,然后根据不同的情况,new出不同的实例。
代码中的if…else杂谈1/代码中的if…else杂谈1中所说这种写法不符合面向对象的开闭原则

反射实现简单工厂

python 反射实现简单工厂相当简单:

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

class TabPane(QFrame):
def __init__(self, buttonNameTuple, parent=None):
# todo


def __pageFactory(self, name):
# import
page = __import__(name + "." + name, fromlist=[name])
# 实例化,获取方法
pageClass = getattr(page, name)
return pageClass(self)

来自C++程序员的羡慕。。。