好的,我有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来检测代码重复,它唯一抱怨的是导入。
答案 0 :(得分:7)
如果你想使用多重继承将所有东西组合成一个大类(这可能是有意义的),那么你可以重构每个父类,以便每个方法和属性都是私有的(以'{开头) {1}}')或者具有该类唯一的2-3个字符前缀。例如,__
类中的所有方法和属性都可以从GUIEvents
开始,ge_
中的所有内容都可以以GUIHelpers
开头。通过这样做,您将获得使用单独的子类实例(gh_
vs self.ge.doSomething()
)的一些清晰度,并且您将避免冲突的成员名称,这是组合这样的主要风险大班组成一个。
答案 1 :(得分:5)
首先查找应用程序需要使用的真实世界概念的类。这些都是课程的天然候选人。
尝试尽可能避免多重继承;它很少有用,总是有点令人困惑。相反,请使用功能组合(“HAS-A”关系)为由其他对象组成的对象提供丰富的属性。
请记住让每个方法做一个小的,具体的事情;这必然需要分解将太多东西分成小块的方法。
重构您发现许多此类方法的情况正在重复彼此的功能;这是另一种找到自然的功能集合的方法,这些功能应该属于一个独特的类。
答案 2 :(得分:1)
我认为这比Python问题更像是一般的OO设计问题。 Python几乎为您提供了所有经典的OOP工具,方便包装。您必须更详细地描述问题(例如GUIEvents
和GUIHelpers
类包含哪些内容?)
需要考虑的一个特定于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)