我有一些类似于
的代码class Foo:
def __init__(self, a, b, c=None):
self.bar = a
if c:
self.data = self.calc(b, c)
def calc(self, bat, baz):
"""calculates some stuff that feels like should belong with the instance of `Foo`"""
在__init__
如果我有一个方法可以生成一些与类实例相关的数据,那么最好让用户调用该方法并存储数据,还是让其中一个实例变量在实例化时存储它?
2的原因是因为我有这个类可以从一些json
文件生成所有内容,所以该类只有一个实例变量和一堆方法吗?这甚至不应该是一个班级吗?我一直认为带有一个实例变量的类是不好的做法,但另一方面,我有一组函数都在同一个json
文件上运行,所以他们觉得它们应该属于某个集团结构。 / p>
编辑:作为第三个问题,与2相关,如果某些方法需要依赖于初始化数据和计算数据的数据,该怎么办?所以在上面的例子中,假设我(用户)计算d=2*a+b
,因为我感兴趣。然后我想做另一个计算,如果我给它d
理论上会加速。所以这个方法看起来像new_calc(self, d)
。我最初计算时应该在课堂上存储d
,然后不要问用户,还是应该让他们更负责任?
答案 0 :(得分:3)
在 init 中包含代码是不是很糟糕?
没有。但如果它做了任何复杂的事情,将代码分解为函数/方法,就像你使用calc一样。如果该方法的唯一调用方是构造函数,那么我建议您使用_calc
而不是calc
。这样,您就向班级用户表明他们并不打算自己致电_calc
。
挑剔:
if c:
self.data = self.calc(b, c)
我对此代码持谨慎态度,因为如果c为None(或0或False),
self.data
仍未设置。所以其他所有方法都必须这样做
检查data
属性是否存在。写
self.data = self.calc(b, c) if c is None else None
或者你可以将None的检查移到calc
方法中并让构造函数中的行说
self.data = self.calc(b, c)
让用户调用该方法
是更好的做法
我认为这取决于确切的用例。如果每个实例代表一个特定的数据集,并且不需要为另一个实例交换一组数据,我说这对构造函数来说更有意义。通过这种方式,实例可以很好地封装数据,并且当用户不应该更改数据时,用户不会犯一个愚蠢的错误。