我正在写一个类来实现一个算法.该算法具有三个复杂程度.我有意义实现这样的类:
class level0:
def calc_algorithm(self):
# level 0 algorithm
pass
# more level0 stuff
class level1(level0):
def calc_algorithm(self):
# level 1 algorithm
pass
# more level1 stuff
class level2(level1):
def calc_algorithm(self):
# level 2 algorithm
pass
# more level2 stuff
Run Code Online (Sandbox Code Playgroud)
我期望calc_algorithm在每个班级都会被覆盖.根据某个命令行选项,我想在数据上运行0级,1级或2级.这就是我调用算法的方法:
for offset in itertools.product(*map(xrange, (dim[0] - 1, dim[1] - 1, dim[2] - 1))):
algorithm(offset).calc_algorithm
Run Code Online (Sandbox Code Playgroud)
其中algorithm要么是level0,level1或level2.
我用其他语言做的方式是:
for offset in itertools.product(*map(xrange, (dim[0] - 1, dim[1] - 1, dim[2] - 1))):
if (level == 0):
level0(offset).calc_algorithm
else:
if (level == 1):
level1(offset).calc_algorithm
else:
level2(offset).calc_algorithm
Run Code Online (Sandbox Code Playgroud)
是否有一种Pythonic方法来对一个类进行别名以引用另一个类,以便我可以这样做:
algorithm = (level == 0) and level0 or (level == 1) and level1 or level2
Run Code Online (Sandbox Code Playgroud)
然后algorithm如上所述打电话?
仅仅为了比较,在Specman中,这是一种面向方面的语言,我可以像这样编写类:
struct algorithm {
level: uint;
// common stuff for all levels
calc_algorithm() is empty;
when (level == 0) {
calc_algorithm() is only {
// level 0 algorithm
};
};
when (level == 1) {
calc_algorithm() is only {
// level 1 algorithm
};
};
when (level == 1) {
calc_algorithm() is only {
// level 1 algorithm
};
};
};
Run Code Online (Sandbox Code Playgroud)
然后,一旦我设置了levelstruct成员,我就可以透明地使用该类的其余部分.
Sil*_*ost 11
你在寻找这些方面的东西吗?
dispatch = {0: level0, 1: level1, 2:level2}
dispatch[offset].calc_algorithm
Run Code Online (Sandbox Code Playgroud)
键(和offset)显然可以来自命令行.