У меня есть следующий сценарий:
У меня есть абстрактные классы 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
.
Вкратце: каковы хорошие альтернативы для эмуляции глобальных констант на уровне модулей, которые можно «перезаписать» в производных модулях (модулях, реализующих абстрактные классы, определенные в первом модуле)?