Python何时进行OOP和何时不进行OOP

Python何时进行OOP和何时不进行OOP,python,python-2.7,Python,Python 2.7,我有一个简单的最佳实践问题,而不是一个与Python中的面向对象编程相关的技术/我该怎么做 我最近一直在编写一些OOP Python代码,这些代码读入数据并将它们存储在定制类中。它太详细了,无法在这里发布所有代码,因此我将使用cakes制作一个非常简单的示例 我的主要类——cake——看起来像下面这样,它存储关于每个“cake”的各种数据属性。一些变量是字符串(例如名称),而其他变量是整数或浮点数(例如图层) class cake(): def __init__(self, name,

我有一个简单的最佳实践问题,而不是一个与Python中的面向对象编程相关的技术/我该怎么做

我最近一直在编写一些OOP Python代码,这些代码读入数据并将它们存储在定制类中。它太详细了,无法在这里发布所有代码,因此我将使用cakes制作一个非常简单的示例

我的主要类——cake——看起来像下面这样,它存储关于每个“cake”的各种数据属性。一些变量是字符串(例如名称),而其他变量是整数或浮点数(例如图层)

class cake():

    def __init__(self, name, layers, icing):
        self.name = name
        self.layers = layers
        self.icing = icing
读取数据时会创建大量这些对象,所有这些对象都存储在列表中:

cakebox = []
cakebox.append(cake("chocolate", 2, "Y"))
cakebox.append(cake("chocolate", 3, "Y"))
cakebox.append(cake("chocolate", 2, "N"))
cakebox.append(cake("lemon", 3, "Y"))
cakebox.append(cake("jamsponge", 2, "N"))
cakebox.append(cake("fruit", 1, "N"))
……等等

“cakebox”列表背后的想法是充当简单的“数据库”,从中可以得出结果。这很容易使用列表理解来完成,例如

icingcakes = [x for x in cakebox if x.icing == "Y"]
但我发现我正在一次又一次地进行一些操作,例如获取所有唯一的蛋糕名称:

uniquecakenames = list(set([x.name for x in cakebox]))
如果我多次使用这段代码(或类似的代码),我会更好地将“cakebox”作为一个类,并将这段代码作为一个方法,或者将“list”作为一个超类,还是在本例中创建一个cakebox类会使事情变得过于复杂

请注意,真正的代码比我简化的蛋糕示例更复杂。。。。!另外,我刚刚在我的iPad上输入了这个例子,所以如果有一些小的代码错误,请原谅我——希望这足以理解要点


如果您的模型包含一个名为
cakebox
的实体,并且该实体具有在您的模型中描述(和命名)的属性和功能,则欢迎所有评论或建议,如果该功能在不止一个地方使用,特别是如果它将来可能被重构,那么最好从项目一开始就将该实体封装在一个类中。您可以根据需要从一个简单的实现开始,但您的代码将立即增加易读性,未来的重构将更加简单。

如果您的代码目前运行正常,您可能会更好地将此问题发布在“是”,创建容器类是完全正常的,基于现有的容器是典型的。您甚至可以使用多个容器作为类的一部分(例如,在本例中,您可能有一个字典来跟踪所有有或没有糖霜的蛋糕)。您可以在添加或删除蛋糕时更新此选项。明智地这样做会使添加和删除稍微慢一点,但查找特定项目的速度要快得多。(OT)“是OOP还是不OOP,这是一个问题——在头脑中,是更高贵的做法是忍受愤怒的仇恨者的弹弓和箭,还是拿起武器对抗职业的海洋,并通过反对,结束它们?”我就是这么想的@ivan_pozdeev!:-)回答得好!我想我将更改当前代码并引入一个新的容器类。一个简单的实现目前就可以了,但是,正如您正确地说的,它将使重构和添加新特性在将来变得更加容易。它还应该使代码更容易为其他用户解释。