在Python中有效地创建实例

时间:2015-12-01 19:08:23

标签: python class

所以我有一个程序,我需要使用从外部文档导入的变量创建4个类的实例。我有一个解决方案,我把它放在下面,但我想知道是否有更简单/更有效的方法,也许是for循环。

partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part1 = Parts(partsList[0], partsList[1], partsList[2],)

partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part2 = Parts(partsList[0], partsList[1], partsList[2],)

partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part3 = Parts(partsList[0], partsList[1], partsList[2],)

partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part4 = Parts(partsList[0], partsList[1], partsList[2],)

3 个答案:

答案 0 :(得分:3)

经验法则:如果您有多个具有相同名称的变量(最后一个数字除外),请用列表替换所有变量。

my_parts = []
for i in range(4):
    partsLine = partsDoc.readline()
    partsList = partsLine.split(' ')
    my_parts.append(Parts(partsList[0], partsList[1], partsList[2],))

您仍然可以使用索引来引用单个部分,例如my_parts[2],所以你没有失去任何表现力。

答案 1 :(得分:2)

生成部件的列表,不要使用单个partN变量名称。使用itertools.islice()限制从文件到前四个的读取行:

from itertools import islice

parts = []
for line in islice(partsDoc, 4):
    part = Parts(*line.split(None, 3)[:3])  # apply the first 3 elements as arguments
    parts.append(part)

使用列表理解可以进一步减少这一点:

parts = [Parts(*line.split(None, 3)[:3]) for line in islice(partsDoc, 4)]

从现在开始,您可以使用索引来解决这四个部分:

parts[2]

为您提供文件中第3行的结果。

请注意,我将str.split(' ')替换为str.split(None, 3);这会改变拆分行为,以在开始和结束时去除额外的空白,并限制分割的数量,使其成为您所需要的,而不是更多。

答案 2 :(得分:1)

基本版

使用函数创建新的Parts实例:

def make_part(parts_doc):
    parts_line = parts_doc.readline()
    parts_list = parts_line.split(' ')
    return Parts(parts_list[0], parts_list[1], parts_list[2])

你可以在列表理解中使用它:

parts = [make_part(parts_doc) for _ in range(4)]

通过索引检索实例:

parts[0]

增量改进I - 使功能成为一条线

def make_part_from_line(parts_line):
    parts_list = parts_line.split(' ')
    return Parts(parts_list[0], parts_list[1], parts_list[2])

文件对象是使用next返回下一行的迭代器:

parts = [make_part_from_line(next(parts_doc)) for _ in range(4)]

增量改进II - 缩短功能

def make_part_from_line(parts_line):
    return Parts(*parts_line.split(' ')[:3])

* - 语法将列表解压缩为三个函数参数。

增量改进III - 使其成为单线

该功能只有一行。直接使用:

parts = [Parts(*next(parts_doc).split(' ')[:3]) for _ in range(4)]