在Python中别名一个类

Nat*_*man 1 python class

我正在写一个类来实现一个算法.该算法具有三个复杂程度.我有意义实现这样的类:

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,level1level2.

我用其他语言做的方式是:

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)显然可以来自命令行.

  • 这应该没问题`dispatch [offset](..).calc_algorithm`(把你的"构造函数"参数放在两个句号所在的位置,或者什么都没有.) (2认同)