通常,当我用Python(和其他语言)创建类时,我很难决定哪种方法更好:(a)在方法函数中使用实例变量,或者(b)在函数定义中列出输入变量。在
(一)
class ClassA(object):
def __init__(self, a):
self.variable_a = a
def square_a(self):
return self.variable_a ** 2
(二)
^{pr2}$这些例子非常简单和明显,但强调了我觉得困惑的是哪个是更好的主意。此外,是否禁止在__init__
方法之外设置实例变量?例如:
class ClassC(object):
def __init__(self, c):
self.variable_c = c
def square_c(self):
self.square_of_c = self.variable_c ** 2
编辑:我理解这个问题有点模糊的本质,但我问这个问题是因为很难知道人们希望在我为协作项目编写的源代码中看到什么。如果我给出的一个或多个例子是反模式,我的想法是,这个问题将为我提供有用的见解。在
政治公众人物20:
There should be one-- and preferably only one --obvious way to do it.
在这个例子中,(b)作为成员函数不是很有用。它可以很容易地成为一个自由函数:
这无疑是一个更好的接口,因为它可以在任何上下文中使用,而不仅仅是来自
ClassB
的实例。在一般来说,如果我知道
self.variable_a
是函数需要的唯一输入,我会使用(a)。如果我想让它和任何东西一起工作,并且它不依赖于类中的任何东西,我会让它成为一个自由函数。如果我想让它处理任何事情,但它依赖于某个类状态,那么让它成为一个以输入为参数的成员。举个例子,如果ClassA
同时包含variable_a
和variable_b
怎么办?您不能使用square_a
来修改variable_b
,这取决于实际的用例。在不,但通常最好确保所有成员都在类实例化时的某个地方初始化。即使您只是将成员初始化为
None
。检查一个成员变量是否是None
要比试图确定是否定义它要容易得多。在编辑:还有几个例子:
^{pr2}$你的问题很模糊,因此很难回答。所有的类似乎都有正确的语法。在
但是b)对我来说比a)更有用 看起来你只想返回输入变量的平方,所以我假设你想一直计算不同值的平方。如果在情况a)中这样做,则必须在每次调用方法之前设置变量。在
b)让我想知道您使用变量_b做什么,因为它从未真正使用过。但我想这是因为简化了。
您还可以考虑将square bu astatic method,因为它不使用任何对象属性。(从不调用
self
)变体c)在语法方面也是有效的,但有些人可能会认为这是一种不好的做法。这确实是一个品味问题,但许多书籍和网站都会建议您在init方法中声明变量。在
相关问题 更多 >
编程相关推荐