OOP& amp;的新手Python - 关于存储大量对象的问题

时间:2011-06-09 17:25:32

标签: python oop

我刚开始使用Python和编程,我有一个关于存储许多对象的一般问题。

到目前为止,我对对象的理解是:我可以定义一个对象,如:

class Meal:

并且有功能,以便我可以找到它,例如Meal.drink返回'soda'和Meal.main返回'pizza'。到目前为止,非常好。

但是,我不确定在存储大量对象时我做的是正确的。现在,我将它们全部保存在列表中,这样每次我想记录一顿新餐时我都会这样做:

temp = Meal()

listOfMeals.append(temp)

如果我想知道我在所有记录的膳食中有多少次苏打水,我会在列表中重复并计算:

for each in listOfMeals

    if each.drink == 'soda':

        sodaCount = sodaCount + 1

这是处理长对象列表的最佳方法吗?这对我来说有点笨拙,但由于我没有面向对象编程的经验(一般的编程经验很少),我不确定我是否忽略了一些明显的东西。

感谢您的帮助。

5 个答案:

答案 0 :(得分:6)

这取决于你的目标。 每个代码都可以更有效地编写,但是你应该首先问自己的问题是:为什么这段代码必须更快?

如果没有理由更快地使用这种方法(因为计数没有那么多使用,餐点列表反正只有一百个条目等),你应该选择简单的东西,如

sodacount = sum(1 for meal in listOfMeals if meal.drink=='soda')

另一方面,如果您经常需要这个计数,您可以将您的膳食列表包装在另一个存储和更新计数的对象中:

class MealList(object):
    # insert __init__, etc.

    def addMeal(self, meal):
        self._meals.append(meal)
        # update the count
        self.counts[meal.drink] += 1

    # insert method to remove meals

meals = MealList()
# add meals etc ....
print meals.counts['soda']

答案 1 :(得分:1)

使用诸如SQLAlchemy之类的ORM将允许您将所有这些存储在数据库中,这可以帮助加速某些类型的查询(“查找饮料属性为'soda'的所有餐点。”)

答案 2 :(得分:1)

你也可以用“功能”风格编写计数循环,然后你甚至不需要sodaCount var。

def count_sodas(meals):
  return reduce(lambda count, meal: count + (1 if meal.drink == 'soda' else 0),
                meals, 0)

答案 3 :(得分:0)

您的代码没有问题。这不是很惯用,但是确定。如果您对缓慢没有任何问题,请按照您编写的方式使用它。

答案 4 :(得分:0)

你有正确的想法。我会提出几点意见:

  1. 定义类时,从对象(或其他类)继承'{1}}
  2. 您说class Meal(object):drink是函数。如果是,请确保在要引用返回值时调用它们。 main应为meal.drink == 'soda'
  3. 除非有充分的理由将膳食的这些属性作为一种功能(即你需要计算它们),否则它们应该是膳食对象的简单“实例属性”。
  4. 如果您发现需要在膳食列表中执行许多常见操作,则可以使用自定义对象meal.drink() == 'soda'包装膳食列表。然后,您可以添加自己的方法。例如,您可能经常需要找到所有“3道菜”餐点:

    Meals

    这是一个相当人为的例子,但你应该明白这个想法。另请注意,有很多方法可以做到这一点;您可能希望子类化列表而不是包装它。如果要将膳食数据存储在数据库中,请考虑@Ignacio的答案。 SQLAlchemy很棒,可以像你需要的那样简单或复杂。