Python 类设计 - 将大类拆分为多个类以组织功能
好吧,我现在有两个非常大的类,每个类都有超过1000行代码。我把它们拆分成了多个小类,然后通过多重继承把它们组合在一起。现在我在想,是否有更简洁、更符合Python风格的方法来处理这个问题。如果完全把它们拆分开来,就会导致无尽的self.otherself.do_something
调用,我觉得这样并不是正确的做法。
为了让事情更清楚,这里是目前的代码结构:
from gui_events import GUIEvents # event handlers
from gui_helpers import GUIHelpers # helper methods that don't directly modify the GUI
# GUI.py
class GUI(gtk.Window, GUIEvents, GUIHelpers):
# general stuff here stuff here
这样做的一个问题是,Pylint(一个代码检查工具)会不停地给我发出“初始化没有被调用”、“未定义的属性”、“属性在定义之前被访问”等无数警告。
编辑:
你可能想看看代码,这样可以更好地理解整个情况。
http://github.com/BonsaiDen/Atarashii/tree/next/atarashii/usr/share/pyshared/atarashii/
请注意,我真的在尽力让这个代码尽可能保持“干净”,我使用Pylint来检测代码重复,唯一让它抱怨的就是导入部分。
5 个回答
我觉得这其实是一个更普遍的面向对象设计问题,而不仅仅是Python的问题。Python提供了很多经典的面向对象编程工具,而且使用起来很方便。不过,你需要更详细地描述一下问题,比如说GUIEvents
和GUIHelpers
这两个类里具体包含了什么内容?
还有一个和Python相关的方面需要考虑:Python支持多种编程方式,有时候最好的解决方案并不是面向对象编程。这种情况在这里可能也适用。不过,还是需要你提供更多的细节,才能得到有意义的答案。
首先,找一些能够代表你应用中需要处理的现实世界概念的类。这些类通常是很好的选择。
尽量避免多重继承; 这种方式很少有用,而且总是让人感到困惑。相反,可以考虑使用功能组合(也就是“拥有”关系),通过其他对象来丰富你的对象的属性。
记得让每个方法只做一件小而具体的事情; 这意味着如果一个方法做的事情太多,就要把它拆分成更小的部分。
如果你发现有很多方法在重复相同的功能,记得重构这些方法; 这也是找到一些自然功能集合的好方法,这些集合应该放在一个独立的类中。
如果你想用多重继承把所有东西合并成一个大类(这样做可能是有道理的),那么你可以对每个父类进行一些调整,让每个方法和属性都是私有的(以'__
'开头)或者有一个独特的短前缀,通常是2到3个字符。比如,你的GUIEvents
类里的所有方法和属性可以都以ge_
开头,而GUIHelpers
里的则可以以gh_
开头。这样做的话,你就能在使用时更清晰地知道是哪个类的方法(比如self.ge.doSomething()
和self.ge_doSomething()
的区别),同时也能避免名字冲突,这在把这么大的类合并成一个时是个主要风险。