在类中迭代或迭代类实例?

时间:2013-10-06 10:48:15

标签: python oop loops

这是关于面向对象编程的一般性问题,我将使用以下简化示例来说明它。

FTP站点内每天都会上传一个文件。根据文件上载日期为文件命名。所以,我们有Day1.txt,Day2.txt等等。 我创建了一个一次下载一个文件的类。因此,当我调用此类的实例时,将根据给定的参数下载文件。例如: downloading_class("2")将下载Day2.txt

现在,我想通过从开始日期到结束日期下载一系列文件来扩展我的程序的功能。显然我会使用for循环。 我的问题是:将for循环集成到类中然后使用类似的东西调用类的实例是一个好习惯:

downloading_class("2","10")

在类外部编写for循环,并在循环中集成实例:

for i in range(start,end):
    downloading_class(i)

为什么一个或另一个更好?

2 个答案:

答案 0 :(得分:1)

我不认为这种情况下的性能受实例化对象的影响很大,但一般来说,我认为最好实例化一次并使用N次而不是实例化并使用N次。

答案 1 :(得分:1)

如果要定义对一系列文件执行的某些操作,那么拥有一个表示一系列文件的类是有意义的。这并不意味着你应该将它集成到代表一个文件的类中,但是,你可以写两个类!

但是,请注意考虑一系列文件上的这些操作是否确实仅适用于日期顺序中连续范围,而不是以任何顺序应用于任何旧文件集合。如果它们可以应用于任何旧的文件集合,那么您可能最好坚持使用您的类来表示单个文件。然后编写一些对文件列表(或其他可迭代)进行操作的其他函数,用于任何旧的集合操作,为方便起见,编写一个函数来返回最常见的情况(日期顺序中的范围)。那么您的代码可能如下所示:

for file in download_range("2", "10"):
    do_something_with_one(file)

或者您正在进行预定义的任何旧收集操作的情况:

do_something_with_many(download_range("2", "10"))

在这两种情况下,您都可以将download_range("2", "10")替换为(downloading_class("2"), downloading_class("4"), downloading_class("6")),将reversed(download_range("2", 10"))(file for file in download_range("2", "10") if file.size() < 1000)替换为{{1}}。或者你喜欢的任何东西,这是设计可以灵活使用的API的目标。