2010-08-16 49 views
11

我想弄清楚如何组织模块和类一起头痛。来自C++,我习惯于封装处理数据所需的所有数据和方法。在Python中有模块,但从我看过的代码中,有些人有很多模块中存储的函数,而其他人几乎总是将它们的函数作为方法绑定到类。在python中组织类和模块

例如,说我有一个数据结构,并想写入磁盘。

一个办法是实施该对象的保存方法,这样我可以只输入

MyObject.save(filename) 

或类似的东西。我在等比例已经看到了另一种方法是有一些像

from myutils import readwrite 

readwrite.save(MyObject,filename) 

这是一个小例子,我不知道这个问题是所有Python和具体,但我一般的问题是,什么是最好的pythonic实践方面的功能与方法组织?

回答

13

似乎松散的功能打扰你。这是python的方式。这是有道理的,因为python中的模块实际上只是一个与其他对象相同的对象。它具有从文件加载它的语言级支持,但除此之外,它只是一个对象。

,所以如果我有一个模块foo.py

import pprint 

def show(obj): 
    pprint(obj) 

然后,当我将其导入从bar.py

import foo 

class fubar(object): 
    #code 

    def method(self, obj): 
     #more stuff 
     foo.show(obj) 

我本质访问foo对象的一个​​方法。 foo模块的数据属性只是在foo中定义的全局变量。模块是单例的语言级别实现,无需在每个方法参数列表中预先加上self

我尽量写尽可能多的模块级功能。如果某个函数只适用于某个特定类的实例,那么我会将它作为该类的一个方法。否则,我尝试使它在模块中定义的每个类的实例上工作,这对它来说是有意义的。

你给出的确切例子的理由是,如果每个类都有一个保存方法,那么如果你以后改变了保存数据的方式(从文件系统到数据库或远程XML文件),那么你必须改变每一个类。如果每个类都实现一个接口来产生它想要保存的数据,那么你可以编写一个函数来保存每个类的实例,并且只修改一次该函数。这就是所谓的单一责任原则:每个班级只能有一个改变的理由。

3

如果你有一个普通的旧类,你想保存到磁盘,我只是把它作为一个实例方法。如果它是一个序列化库,可以处理不同类型的对象,我会做第二种方法。

+2

术语“类方法”听起来像一个'classmethod',它不适用。适当的东西将被称为“方法”或“实例方法”。 – 2010-08-17 04:41:47

+0

是的,你是对的。我的意思是一个实例方法。 – 2010-08-17 05:30:08