のクラスと名前空間、私は次のシナリオを持っている:モジュール、Pythonの
私は抽象クラスA
とB
を持っている、とA
は、いくつかのタスクを実行するためにB
を使用しています。どちらのクラスでも、抽象クラスを継承する具象クラスによって設定されるいくつかの "定数"パラメータ(現在はクラス属性として実装されています)があり、一部のパラメータは共有されています(派生した "スイート"クラスSubA
およびSubB
)。
私がここで直面している問題は、名前空間がPythonでどのように構成されているかです。理想的な解決方法は、Pythonが動的スコープを持っている場合は、それらのパラメータをモジュール変数として宣言することです。拡張クラスの新しいスイートを作成するときには、新しいモジュールで上書きできます。しかし(幸いなことに、ほとんどの場合、より安全で便利なので)Pythonはそれほど機能しません。 nbodyシミュレータのようなものを想像して、より具体的なコンテキスト(ではない私の実際の問題、そしてもちろん正確にも現実的ではない)でそれを置くために
:
ATTRACTION_CONSTANT = NotImplemented # could be G or a Ke for example
class NbodyGroup(object):
def __init__(self):
self.bodies = []
def step(self):
for a in self.bodies:
for b in self.bodies:
f = ATTRACTION_CONSTANT * a.var * b.var/distance(a, b)**2
...
class Body(object):
def calculate_field_at_surface(self):
return ATTRACTION_CONSTANT * self.var/self.r**2
その後、他のモジュールがPlanetarySystem(NBodyGroup)
を実装する可能性があり、 Planet(Body)
をATTRACTION_CONSTANT
〜6.67384E-11
に設定し、他のモジュールはMolecularAggregate(NBodyGroup)
とParticle(Body)
を実装し、ATTRACTION_CONSTANT
〜8.987E9
と設定できます。
概要:派生モジュール(最初のモジュールで定義された抽象クラスを実装するモジュール)で "上書き"できるモジュールレベルでグローバル定数をエミュレートする良い選択肢は何ですか?
より多くのPRができますか?あなたの実際の問題についてecise? 1つのグローバルなATTRACTION_CONSTANT定義を派生クラスを含むモジュールに置き、2つのサブクラスの値をこのグローバル変数で「上書きする」問題は何ですか? – Simon