【发布时间】:2012-01-15 19:23:54
【问题描述】:
我有以下场景:
我有抽象类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 定义放在包含派生类的模块中并用这个全局变量“覆盖”两个子类中的值有什么问题?
标签: python class module namespaces