我有以下情形:模块,类和命名空间在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
。
简而言之:在模块级别模拟全局常量可以在派生模块(实现第一个模块中定义的抽象类的模块)中“覆盖”的替代方案是什么?
你能更多的公关吗?珍惜你的实际问题?将一个全局ATTRACTION_CONSTANT定义放入包含派生类的模块中,并用这个全局变量“覆盖”两个子类中的值会出现什么问题? – Simon