在循环中创建类实例并更新它

时间:2018-06-15 05:38:34

标签: python loops class oop

我们说我有一个数据集(' test.csv'),如下所示:

Name,Fruit,Price
John,Apple,1.00
Steve,Apple,1.00
John,Mango,2.00
Adam,Apple,1.00
Steve,Banana,1.00

虽然有几种更简单的方法可以做到这一点,但我想将这些信息组织为python中的一个类。因此,理想情况下,类的实例看起来像:

{'name': 'John', 'Fruits': ['Apple','Mango'], 'Price':[1.00, 2.00]}

将数据集加载到类中的方法是将每个实例存储在列表中。

class org(object):
    def __init__(self,name,fruit,price):
        self.name = name
        self.fruit = [fruit]
        self.price = [price]

    classes = []
    with open('test.csv') as f:
        for line in f:
            if not 'Name' in line:
                linesp=line.rstrip().split(',')
                name = linesp[0]
                fruit = linesp[1]
                price = linesp[2]
                inst = org(name,fruit,price)
                classes.append(inst)
    for c in classes:
        print (c.__dict__)
  1. 在这种情况下,我怎么知道John'已作为实例存在?

  2. 如果是这样,我该如何更新' John'?用classmethod?

  3. @classmethod
        def update(cls, value):
            cls.fruit.append(fruit)
    

1 个答案:

答案 0 :(得分:2)

更新您的实例不需要任何特殊内容。您的类属性是公共的,因此只需访问它们即可进行更新。

如果你坚持使用列表作为实例容器,你可以做某事。像这样:

classes = []
with open('test.csv') as f:
    for line in f:
        if not 'Name' in line:
            name,fruit,price=line.rstrip().split(',')
            exists = [inst for inst in classes if inst.name == name]
            if exists:
                exists[0].fruit.append(fruit)
                exists[0].price.append(price)
            else:
                classes.append(org(name,fruit,price))
for c in classes:
    print (c.__dict__)

但是,我建议使用dict,因为它可以更轻松地查找和访问实例

classes = {}
with open('test.csv') as f:
    for line in f:
        if not 'Name' in line:
            name,fruit,price=line.rstrip().split(',')
            if name in classes:
                classes.get(name).fruit.append(fruit)
                classes.get(name).price.append(price)
            else:
                classes.update({name: org(name,fruit,price)})

for c in classes.values():
    print (c.__dict__)

两种解决方案都会给你同样的东西:

{'name': 'John', 'fruit': ['Apple', 'Mango'], 'price': ['1.00', '2.00']}
{'name': 'Steve', 'fruit': ['Apple', 'Banana'], 'price': ['1.00', '1.00']}
{'name': 'Adam', 'fruit': ['Apple'], 'price': ['1.00']}

为了完整起见,评论中下面的@MadPhysicist可能意味着更新dict的一种笨重方式是我使用dict的方法而不是通过订阅访问项目。

# update existing instance in the dict
classes[name].fruit.append(fruit)

# add new instance to the dict
classes[name] = org(name, fruit, price)

我个人觉得有点难看,因此我倾向于使用这些方法:)