迭代python中对象实例的特定属性

时间:2014-04-30 12:17:49

标签: python oop

我是一名新手程序员,所以请原谅我没有使用特定于Python的词汇。

假设我使用属性 CarReg 制作模型 Color <定义类 CarSpecs / em>,创建此类的多个实例(称为记录)并逐个将它们附加到名为 SuperCars 的文本文件中。我希望我的程序要做的是读取整个文件并返回红色的汽车数量(即通过查找每个实例的属性 Color )。

这是我到目前为止所做的:

定义了一个类:

class Carspecs(object):  
    def __init__(self, carreg, make, model, color):    
        self.CarReg = carreg   
        self.Make = make  
        self.Model = model   
        self.Color = color 

然后我创建了几个实例并定义了一个函数来将实例(或者你可以说''records'')添加到 SuperCars

def addCar(CarRecord):  
   import pickle  
       CarFile = open('Supercars', 'ab')  
       pickle.dump(CarRecord, CarFile)  
       CarFile.close()  

接下来我该怎么办才能输出红车的数量?

1 个答案:

答案 0 :(得分:1)

您必须再次打开该文件,阅读所有记录,然后查看哪些车辆Color属性等于红色。因为您要在pickle中保存每个实例,所以您必须执行以下操作:

>>> with open('Supercars', 'rb') as f:
...    data = []
...    while True:
...        try:
...            data.append(pickle.load(f))
...        except EOFError:
...            break
...
>>>
>>> print(x for x in data if x.Color == 'red')

我建议您将数据存储在列表中并挑选该列表,这样您就不必使用hacky循环获取所有项目。存储这样的列表很容易。假设您已创建CarSpec个对象列表并将其存储在列表records中:

>>> with open('Supercars', 'wb') as f:
...    pickle.dump(records, f)
...
>>>

然后阅读它就像:

>>> with open('Supercars', 'rb') as f:
...     data = pickle.load(f)
...
>>>

您甚至可以轻松过滤它:

>>> with open('Supercars', 'rb') as f:
...     data = [x for x in pickle.load(f) if x.Color == 'Red']
...
>>>

如果您想在将它们存储在泡菜中之前显示,您可以遍历records - 列表并打印红色的汽车。