如何构建一个多文件Python应用程序

时间:2017-09-29 22:51:18

标签: python python-2.7

使用Python 2.7,我有一个大型类对象,在一个文件中,我想按组或相关函数分成多个文件。例如,我有“类API(对象)”,我想为所有用户方法(添加用户,更新用户,删除用户)和所有订单方法的单独Python文件分别创建Python文件(创建订单,更新)订单,删除订单)。但最终用户不应该知道这种分离,例如:

z = test.api()                __init__.py
z.adduser(jeff)               user.py
z.createOrder(65, "jeff")     orders.py
z.showOpenOrders("jeff")      orders.py
z.completeOrder()             orders.py
z.emailUser("Jeff")           email.py

我一直在寻找“扩展python类”,但我不相信我正在使用正确的术语进行搜索。请帮忙。

2 个答案:

答案 0 :(得分:1)

我会创建专门的类(UsersOrders),其中实例在API.__init__中创建(如果需要,他们可以保存对API实例的引用)。然后可以通过API实例的成员属性或属性检索专用实例。

对他们的打电话如下:

z = test.api()
z.users.add(jeff)
z.orders.create(65, "jeff")
z.orders.showOpen("jeff")

等等。

答案 1 :(得分:0)

首先,我建议不要采用这种方法。在python中,将类的定义保存在一个文件中是典型的。另一个答案讨论了跨多个类拆分API的选项,如果这对您的应用程序有效,那么这可能是一个很好的选择。但是,你提出的建议在Python中是可能的,所以我将描述如何做到这一点。

在a.py中:

class A:

# some methods go here
b.py中的

:     进口一个     def extra_a_method(self,arg1):         #方法体     a.A.extra_a_method = extra_a_method     del extra_a_method

因此,我们创建一个函数并将其添加到A类中。我们必须在某个范围内创建函数,因此为了保持该范围的清晰,我们从该范围中删除了该函数。 出于语法原因,您无法执行def A.new_a_method。 我知道这将主要用于Python3,但尚未对Python2进行分析。 有一些捕获:

  • b必须在方法出现在A之前导入;这是一个大问题

  • 如果A有一个非常重要的元类,则额外方法的处理将与原始类中方法的处理不同。作为一个例子,我认为SQLAlchemy会得到这种正确的添加,但其他框架可能不会。

如果你知道A从头开始应该包含的所有内容,那么有时可以使用的替代方案

在a.py中:

import a_extra_1, a_extra_2

class A(a_extra_1.AExtra1, a_extra_2.AExtra2):

    # methods can also go here

在这里,我们将其他方法作为mixins处理为A。通常,您希望在任何继承类之后添加mixins。 这种方法也有一些缺点:

  • 如果您不小心,可能导致循环导入

  • 您必须提前了解A所需的所有方法

  • 所有代码都会立即导入(这也是一项功能)

在这种方法中也存在非平凡元类的问题,尽管如果框架支持继承,这可能会有效。