拆分一个太大的类

max*_*max 2 python class

我有一个类BigStructure从一些输入构建一个复杂的数据结构.它还包括对该数据结构执行操作的方法.

这个课程变得太大了,所以我试图把它分成两部分来帮助维护.我认为将课程转移到一个新班级是很自然的,比如上课OperationsOnBigStructure.

不幸的是,由于课程BigStructure非常独特,OperationsOnBigStructure因此无法与其他课程合理地重复使用.从某种意义上说,它永远与之相关BigStructure.例如,典型的操作可能包括以对BigStructure对象有意义的方式遍历大型结构实例.

现在,我有两个课程,但感觉我没有改进任何东西.事实上,我使事情稍微复杂一点,因为我现在需要将BigStructure对象传递给方法OperationsOnBigStructure,并且他们需要在内部存储该对象.

我应该和一个大班同学吗?

Mar*_*ner 6

我认为将操作转移到一个新类(例如 OperationsOnBigStructure 类)中是很自然的。

我想说,这与面向对象设计的全部内容完全相反。OOD 背后的理念是将数据和方法放在一起。

通常,(太大)班级是责任过多的标志:即您的班级只是做了太多事情。看来您首先定义了一个数据结构,然后向其中添加了函数。您可以尝试将数据结构分解为子结构并为它们定义独立的类(即使用聚合)。但如果不了解更多,就很难说...

当然,有时,一个程序在一个大类中运行得很好。但如果你自己对此感到不舒服,那就强烈暗示你要开始做一些反对的事情......


Ema*_* Ey 6

我想出的解决这个问题的方法是创建一个包含类的包.有点像:

MyClass/
    __init__.py
    method_a.py
    method_b.py
    ...
Run Code Online (Sandbox Code Playgroud)

在我的情况下__init__.py包含实际的数据结构定义,但没有方法.要将方法"附加"到类中,我只需将它们导入类的命名空间即可.

内容method_a.py:

def method_a(self, msg):
    print 'a: %s' % str(msg)
Run Code Online (Sandbox Code Playgroud)

内容__init__.py:

class MyClass():
    from method_a import method_a
    from method_b import method_b

    def method_c(self):
        print 'c'
Run Code Online (Sandbox Code Playgroud)

在python控制台中:

>>> from MyClass import MyClass
>>> a = MyClass()
>>> dir(a)
['__doc__', '__module__', 'method_a', 'method_b', 'method_c']
>>> a.method_a('hello world')
a: hello world
>>> a.method_c()
c
Run Code Online (Sandbox Code Playgroud)

这对我有用.

  • @NickSweet我一直在使用这个解决方案大约2年的生产,到目前为止我一直很好.奇怪的是,似乎没有一个首选方法(PEP)来做这件事. (2认同)
  • 对于任何新读者来说:这很不寻常。将导入放入类定义中通常是不好的做法 - 您正在为运行时的意外做好准备。从顶部的另一个模块导入函数并在方法中调用这些函数会更加困难...... (2认同)