私はアルゴリズムを実装するためのクラスを作成しています。このアルゴリズムは、3つのレベルの複雑さを有する。私はcalc_algorithm
は、各クラスでオーバーライドされることを期待しPythonでのクラスのエイリアス
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
:それはこのようなクラスを実装するために私には意味があります。特定のコマンドラインオプションに応じて、データに対してレベル0、レベル1またはレベル2のいずれかを実行したいとします。これは私が、アルゴリズムを呼び出す方法です:
for offset in itertools.product(*map(xrange, (dim[0] - 1, dim[1] - 1, dim[2] - 1))):
algorithm(offset).calc_algorithm
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
は、私は何ができるように、別のクラスを参照するクラスをエイリアスにPython的な方法はあります:
algorithm = (level == 0) and level0 or (level == 1) and level1 or level2
を呼び出して、上記のようにalgorithm
を呼び出しますか?
、:
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
};
};
};
そして、私はlevel
構造体のメンバを設定したら、その後、私は残りの部分を使用することができますクラスの
をレベルを渡すことができます - それは「より多くのです「コマンドライン引数に基づいてクラスを選択する」、または「ユーザー入力に基づいてクラスを選択する」などの方法があります。 –
そうだが、これはコマンドラインやユーザー入力から来る必要はありません。クラス間の区別は、以前の計算の結果である可能性があります。 –