Python类设计 - 将大类拆分为多个类以分组功能

时间:2010-03-24 03:34:35

标签: python class

好的,我有2个非常大的课程>我目前分为多个1k行。然后,他们使用多重继承重新组合。现在我想知道,如果有更干净/更好的pythonic方式这样做。完全将它们分解出去会导致无数次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抱怨给我数万亿的“init not called”/“undefined attribute”/“在定义之前访问的属性”警告。

修改
你可能想看一下代码,让自己想象一下整个事情究竟是什么 http://github.com/BonsaiDen/Atarashii/tree/next/atarashii/usr/share/pyshared/atarashii/

请注意,我正在尝试将这个东西尽可能保持干燥,我正在使用pylint来检测代码重复,它唯一抱怨的是导入。

5 个答案:

答案 0 :(得分:7)

如果你想使用多重继承将所有东西组合成一个大类(这可能是有意义的),那么你可以重构每个父类,以便每个方法和属性都是私有的(以'{开头) {1}}')或者具有该类唯一的2-3个字符前缀。例如,__类中的所有方法和属性都可以从GUIEvents开始,ge_中的所有内容都可以以GUIHelpers开头。通过这样做,您将获得使用单独的子类实例(gh_ vs self.ge.doSomething())的一些清晰度,并且您将避免冲突的成员名称,这是组合这样的主要风险大班组成一个。

答案 1 :(得分:5)

首先查找应用程序需要使用的真实世界概念的类。这些都是课程的天然候选人。

尝试尽可能避免多重继承;它很少有用,总是有点令人困惑。相反,请使用功能组合(“HAS-A”关系)为由其他对象组成的对象提供丰富的属性。

请记住让每个方法做一个小的,具体的事情;这必然需要分解将太多东西分成小块的方法。

重构您发现许多此类方法的情况正在重复彼此的功能;这是另一种找到自然的功能集合的方法,这些功能应该属于一个独特的类。

答案 2 :(得分:1)

我认为这比Python问题更像是一般的OO设计问题。 Python几乎为您提供了所有经典的OOP工具,方便包装。您必须更详细地描述问题(例如GUIEventsGUIHelpers类包含哪些内容?)

需要考虑的一个特定于Python的方面如下:Python支持多种编程范例,通常最好的解决方案不是OOP。这个可能就是。但同样,你必须投入更多细节才能获得有意义的答案。

答案 3 :(得分:0)

通过实施模型 - 视图 - 控制器设计,可以大大改善您的代码。根据GUI和工具的设置方式,您也可以从GUI的“widgetizing”部分中受益,这样您就可以使用一个主模型 - 视图 - 控制器来管理一堆GUI,而不是拥有一个巨大的模型 - 视图 - 控制器。较小的模型 - 视图 - 控制器,每个都用于GUI的不同部分。这将允许您将工具和GUI分解为多个类,并且您可以重用其中的一部分,从而减少需要维护的代码总量。

虽然python支持多种编程范例,但对于GUI工具,最佳解决方案几乎总是面向对象的设计。

答案 4 :(得分:0)

一种可能性是将导入的函数分配给类属性:

在档案a_part_1.py中:

def add(self, n):
    self.n += n
def __init__(self, n):
    self.n = n

在主类文件中:

import a_part_1 

class A:
    __init__ = a_part_1.__init__
    add = a_part_1.add

或者,如果您不想在添加新方法时更新主文件:

class A: pass

import a_part_1 
for k, v in a_part_1.__dict__.items():
    if callable(v):
        setattr(A,k,v)