2010-11-22 39 views
0

我是OOP的新手,因此,我正在寻找关于对以下问题出现的问题进行编码的良好实践的建议。关于是否在__init __()方法中包含某些内容的问题

我正在定义一个Seller(a, b, c, d)类。这个类有很多属性,其中两个是mostRecentProfitprofitHistory。然而,当这个类被初始化时,这两个值是不知道的。在实现这些程序之前,必须执行程序中的其他一些步骤。我的问题是:

在销售类的__init__(a, b, c, d),我应该写

self.mostRecentProfit = None 
self.profitHistory = [] 

,或者我不应该在所有的__init__方法定义这些。前者对我来说很吸引人的原因是,通过查看__init__()方法,我可以知道班级的所有属性。但是,这可能不是一个很好的理由。任何建议,将不胜感激。

谢谢。

+0

请考虑遵循[PEP 8](http://www.python.org/dev/peps/pep-0008/)中提出的标准Python命名指南 - self.most_recent_profit和self.profit_history。 – 2010-11-22 13:37:20

+0

@克里斯......这和处方压痕一样糟......哦,等等。 :) – sje397 2010-11-22 13:59:47

回答

3

我会定义它们。根据我的经验,当处理实例的代码频繁引用这些属性时,并不这样做,这意味着在循环之前最终会输入if object.profitHistory:等。如果列表中存在空列表,则可以跳过这些条件。正如你所说,它使它更清晰易读。

+0

+1定义它们,如果它们对班级起作用是必要的,则不要这样做。 – Falmarri 2010-11-22 18:59:12

4

定义__init__()中的属性可以使代码更好地适用于没有看到代码的人必须开始使用代码的情况。当一个类开始访问一个起初似乎不存在的属性时,可能会引起混淆。

此外,由于您的默认值之一是一个列表而不是None,因此对它进行初始化意味着您始终可以将该属性视为列表,而不必担心其状态。

+0

OP的代码*会将列表初始化为空白列表。 – martineau 2010-11-22 15:11:33

+0

如果他应该定义它们,OP的问题是**。如果他没有定义属性,那么他不会将它初始化为任何东西。我对列表的评论是为了进一步支持为什么定义它们是有意义的(因为它在第一次使用时需要初始化)。 – unholysampler 2010-11-22 15:33:30

1

我会在__init()方法中定义它们,因为这不仅会记录它们通常都是什么,而且如果将它们的默认值全部定义为有效,那么允许其余大部分代码轻松地处理实例即使这些属性永远不会更新。

因此,在您的示例中,这意味着初始化self.mostRecentProfit0或者可能是0.0而不是None。这样做可以在不参考每个引用之前检查它是否存在,并且每个引用都包含在try/except块中以处理它们从未明确设置为其他值的情况。

相关问题