Python中的详细__init__方法是不是很糟糕?

时间:2012-03-12 14:51:21

标签: python oop

我有一个用Python编写的程序,它执行以下操作:

用户输入文件夹的名称。在该文件夹中有8-15个.dat文件,扩展名不同。

程序打开这些dat文件,将它们输入SQL数据库,然后允许用户选择对数据库所做的不同更改。然后将数据库导出回.dat文件。可以执行大约5-10种不同的操作。

我计划设计的方法是为每组文件创建一个标准类。用户将输入文件夹的名称,并且将创建具有某些属性(文件名,文件字典,文件版本(有不同版本)等)的对象。确定这些属性需要打开其中一些文件,读取文件名等等。

是否应该在__init__方法中执行此操作?或者,是否应该在__init__方法中调用的不同实例方法中执行此操作?或者这些方法应该在其他地方,只有在程序中的其他地方需要属性时才会被调用?

我已经用Java编写了这个程序。我有一个构造函数,它调用类中的其他方法来设置对象的属性。但我想知道Python中的标准做法是什么。

4 个答案:

答案 0 :(得分:3)

嗯,Python中的优秀OOP实践并没有什么特别之处。在Java和Python中,将一个大方法分解为一堆小方法是个好主意。除其他外,小方法使您有机会编写不同的构造函数:

class GroupDescriptor(object):
    def __init__(self, file_dictionary):
        self.file_dict = file_dictionary
        self.load_something(self.file_dict['file_with_some_info'])

    @classmethod
    def from_filelist(cls, list_of_files):
        file_dict = cls.get_file_dict(list_of_files)
        return cls(file_dict)

    @classmethod
    def from_dirpath(cls, directory_path):
        files = self.list_dir(directory_path)
        return cls.from_filelist(files)

此外,我不知道它是如何在Java中但在Python中你不必担心构造函数中的异常,因为它们处理得很好。因此,处理像文件这样容易出错的事情是完全正常的。

答案 1 :(得分:1)

看起来您正在描述 初始化的操作,因此将它们放入__init__是完全可以的。另一方面,这些操作看起来相当昂贵,并且在程序的其他部分可能很有用,因此您可能希望将它们封装在一些单独的函数中。

答案 2 :(得分:1)

实例化对象时调用__init__方法。

来自C ++背景我相信除了构造函数中的初始化之外,做其他实际工作并不好。

答案 3 :(得分:1)

使用长__init__方法没有问题,但我会避免它,因为它更难以测试。我的方法是创建从__init__调用的较小方法。这样你就可以分别测试它们和初始化。

是否应该在需要时调用它们或者预先运行它们取决于你需要它们做什么。如果它们是昂贵的操作,并且通常并非全部都需要,那么也许最好只在需要时调用它们。另一方面,您可能希望预先运行它们,以便在需要属性时没有延迟。

从你的问题不清楚你是否真的需要上课。我没有使用Java的经验,但我知道其中的所有内容都是一个类。在python中,只要有一个函数就可以完全接受,如果需要的话,只需要在需要实例和其他经典事物时创建类。