Python何时使用面向对象编程,何时不使用面向对象编程

3
我有一个关于Python面向对象编程的简单最佳实践问题,而不是技术性或“如何做?”问题。
最近,我一直在编写一些OOP Python代码,用于读取数据并将其存储在自定义类中。这里太详细了,无法全部发布代码,因此我将使用蛋糕的非常简单的示例进行说明。
我的主要类 - 蛋糕 - 大致如下,并存储有关每个“蛋糕”的各种数据属性。某些变量是字符串,例如名称,而其他变量是整数或浮点数,例如层数。
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"))

“蛋糕盒子”列表的想法是像一个简单的“数据库”,可以从中获取结果。这可以通过使用列表推导式轻松实现,例如:

icingcakes = [x for x in cakebox if x.icing == "Y"]

但是我发现我一再执行某些操作,例如获取所有唯一蛋糕名称:

uniquecakenames = list(set([x.name for x in cakebox]))

如果我会多次使用这段代码(或类似代码),是否最好创建一个“cakebox”类,并将此代码作为方法,使用“list”作为超类,或者在这个例子中创建一个cakebox类会使事情变得过于复杂?

请注意,真实代码比我的简化蛋糕示例更加复杂....! 另外,我在iPad上仅输入了此示例,请原谅我如果有轻微的代码错误-希望足以传达主要观点。

欢迎所有评论或建议。


2
如果您的代码当前可以正常工作,那么最好在http://codereview.stackexchange.com/上发布此问题。 - shuttle87
是的,制作一个容器类并以现有容器为基础是非常正常的。你甚至可以在类中使用多个容器(例如,在这种情况下,你可能会有一个字典来跟踪所有有或没有糖霜的蛋糕)。当添加或删除蛋糕时,你可以更新它。明智地做这件事会使添加和删除变慢一些,但查找特定项目会快得多。 - kindall
2
(OT)“面向对象编程还是不面向对象编程,这是个问题—— 在心灵上忍受那些令人发指的批评者的攻击, 还是拿起武器反对一大堆类, 通过反对它们来结束它们?” - ivan_pozdeev
这正是我在想的,@ivan_pozdeev! :-) - Mark
1个回答

3

如果你的模型中包含了一个名为cakebox的实体,并且该实体具有在模型中描述(并命名)的属性和功能,如果该功能在多个地方使用,特别是如果将来可能进行重构,那么最好从项目开始时就将该实体封装到一个类中。你可以从合适的简单实现开始,但你的代码立即会增加可读性,并且将来重构会更加简单。


太棒了!我想我会更改我的当前代码并引入一个新的容器类。暂时只需要一个简单的实现,但正如你所说,这将使未来的重构和添加新功能变得更加容易。它还应该使其他用户更容易理解代码。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接