我刚开始使用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
这是处理长对象列表的最佳方法吗?这对我来说有点笨拙,但由于我没有面向对象编程的经验(一般的编程经验很少),我不确定我是否忽略了一些明显的东西。
感谢您的帮助。
答案 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)
你有正确的想法。我会提出几点意见:
class Meal(object):
和drink
是函数。如果是,请确保在要引用返回值时调用它们。 main
应为meal.drink == 'soda'
如果您发现需要在膳食列表中执行许多常见操作,则可以使用自定义对象meal.drink() == 'soda'
包装膳食列表。然后,您可以添加自己的方法。例如,您可能经常需要找到所有“3道菜”餐点:
Meals
这是一个相当人为的例子,但你应该明白这个想法。另请注意,有很多方法可以做到这一点;您可能希望子类化列表而不是包装它。如果要将膳食数据存储在数据库中,请考虑@Ignacio的答案。 SQLAlchemy很棒,可以像你需要的那样简单或复杂。