我有以下情景:
我有抽象类A和B,A使用B执行一些任务。在这两个类中,都有一些“常量”参数(目前实现为类属性)需要由扩展这些抽象类的具体类设置,其中一些参数是共享的(它们应该在派生的“套件”类SubA和SubB中具有相同的值)。
我在这里面临的问题是Python中命名空间的组织方式。如果Python具有动态作用域,则理想的解决方案是将这些参数声明为模块变量,然后在创建新的扩展类套件时,可以在其新模块中轻松地覆盖它们。但是(幸运的是,因为对于大多数情况而言,这更加安全和便捷),Python并不是这样工作的。
更具体地说(不是我的实际问题,当然也不准确或现实),可以想象像nbody模拟器一样的东西:
然后,其他模块可以实现一个
简而言之:在模块级别上模拟全局常量的良好替代方案是什么,这些常量可以在衍生模块中“重写”(即实现第一个模块中定义的抽象类的模块)?
我有抽象类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
。简而言之:在模块级别上模拟全局常量的良好替代方案是什么,这些常量可以在衍生模块中“重写”(即实现第一个模块中定义的抽象类的模块)?