如何重构一个Python“神类”?
问题 我正在一个Python项目中,该项目的主类有点“ God Object ”。有这么受诅咒的多属性和方法! 我想重构班级。 至今… 第一步,我想做一些相对简单的事情。但是当我尝试最直接的方法时,它破坏了一些测试和现有示例。 基本上,该类具有大量的属性列表,但是我可以清楚地查看它们,并认为:“这5个属性是相关的……这8个属性也都是相关的……剩下的就是这些。” getattr 我基本上只是想将相关属性分组为类似dict的帮助器类。我有种__getattr__理想的工作选择。因此,我将属性移到了一个单独的类,并且确实可以__getattr__很好地发挥其魔力…… 一开始。 但是后来我尝试运行其中一个示例。示例子类尝试直接设置这些属性之一(在类级别)。但是由于该属性不再在父类中“物理定位”,所以我收到一个错误消息,指出该属性不存在。 @属性 然后,我阅读了有关@property装饰器的信息。但是后来我也读到,self.x = blah当x父类的属性是子类时,它会给想要做的子类带来问题。 期望的 self.whatever即使父类的whatever属性不在类(或实例)本身的“实体位置” ,也要让所有客户端代码继续使用。 将相关属性分组到类似dict的容器中。 减少主类中代码的极端噪音。 例如,我不只是想更改此内容: larry = 2 curly = 'abcd' moe = self.doh() 变成这个: larry = something_else('larry') curly = something_else('curly') moe = yet_another_thing.moe() …因为那仍然很吵。尽管这成功地将简单的属性赋予可以管理数据的属性,但是原始属性具有3个变量,而经过调整的版本仍具有3个变量。 但是,我可以这样: stooges = Stooges() 如果查找self.larry失败,将检查stooges并查看是否larry存在。(但是,如果子类尝试larry = 'blah'在类级别执行此操作,那么它也必须起作用。) …