使用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类”,但我不相信我正在使用正确的术语进行搜索。请帮忙。
答案 0 :(得分:1)
我会创建专门的类(Users
,Orders
),其中实例在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
所需的所有方法
所有代码都会立即导入(这也是一项功能)
在这种方法中也存在非平凡元类的问题,尽管如果框架支持继承,这可能会有效。