我的问题是关于multiprocessing.Managers.BaseManager的正确用法。文档中的主要示例显示了如何通过创建BaseManager的子类来自定义此类。我可以理解是否有人这样做是为了修改或扩展BaseManager的行为。
但是在网络上,甚至在Stackoverflow上的answer中,人们通过创建一个根本不改变BaseManager行为的子类来演示BaseManager的用法:
def get_success_url(self):
if self.object.workout_type = '5 rounds'
return reverse('five-rounds-log-create')
elif self.object.workout_type = 'Drop Reps'
return reverse('drop-reps-log-create')
else
return reverse('workout-log-menu')
我的问题是:在这种情况下,这样做有什么意义?为什么不直接使用BaseManager和BaseManager.register()?我错过了什么吗?
答案 0 :(得分:2)
BaseManager.register
是classmethod。这意味着如果您在BaseManager
实例上调用register,项目中的所有其他代码段也将看到注册类型。如果其中一段代码试图做同样的事情,即直接用BaseManager
注册自己的类型,使用与你相同的名称,这就成了一个问题。子类化BaseManager
是一种避免此namespace pollution的方法。
如果您确定此问题永远不会影响您 - 例如,如果您正在编写程序而不是库,则会出现这种情况,并且您确信以后不会以某种方式扩展它这可能会破坏事情 - 然后使用BaseManager.register
绝对没问题。 (请注意,这个观点是值得商榷的。我认为这很好,因为我更喜欢实用的方法。另一种观点是, 时你最终想要扩展你的程序,你可能已经忘记了这件事会破裂,因此最好先把它弄好。)