使用包在多个模块之间拆分Python类

时间:2012-11-04 02:05:15

标签: python

我在python中写了一些代码作为一个类,但是现在我正在尝试将它作为一个包进行分发,并且我在弄清楚不同部分应该如何组合时遇到了一些麻烦。

所以,正如我最初编写代码时,我有一个包含一些函数的类,包括一个__init__函数。我现在将这些函数中的每一个拆分成用函数名命名的文件,但是我不确定将 init 函数放在哪里,因为它需要参数。下面是一个例子。

原始格式:

class className(object):

    def __init__(self, arg1, arg2):
         self.arg1 = arg1
         self.arg2 = arg2

    def func1(self):

    def func2(self, arg3):

使用:

import name

a = name.className(arg1, arg2)
a.func1()
a.func2(arg3)

现在文件树是:

Name/
    /className
        __init__.py
        func1.py
        func2.py

并包含其他功能。我想保持与原始版本相同的基本使用模式。

现在,问题是__init__函数应该去哪里?在__init__.py文件中?别的地方?另一个问题是我想在__init__.py文件中添加一些导入;我知道他们应该进入__init__.py文件,但我不知道它们与__init__函数的关系。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:9)

您无法跨多个文件拆分类。包应该包含多个模块,这些模块是包含代码的文件(完整的类,函数等)。

导入包时会运行__init__.py文件(尽管很少用它来实际执行很多代码)并告诉Python目录是一个包,它不是类的构造函数。

包(文件夹)应该是包和模块的集合,而模块(文件)应该是代码的集合。

正常层次结构的一个例子:

- somepackage (Folder)
    - __init__.py (File)
    - somemodule.py (File)
        - SomeClass (Code)
        - some_function (Code)

作为最后一点,我说你不能跨越多个文件分割一个类 - 技术上你可以通过猴子修补函数进入类或其他一些这样的怪异来做到这一点,但你永远不会想要它,因为它会模糊你的代码很多。