我有一些代码,大致如下:
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
文件,所以它们感觉应该属于某种混合结构。
编辑:关于问题2,如果其中一些方法需要基于已初始化的数据和计算出的数据生成数据。那么在上面的示例中,假设我(用户)计算了d = 2 * a + b
,因为这对我很重要。然后我想做另一个计算,理论上如果给它d
会更快。那么这个方法看起来像new_calc(self, d)
。当我最初计算它时,我应该将d
存储在类中,然后不再要求用户提供它,还是让他们更加负责呢?
c
是None
,你应该将self.data
设置为一个合理的默认值。同时请注意,对于空列表、空元组、空集合、空字典、空字符串和数值零(整数、浮点数或十进制数),bool(c)
可能会被求值为False
。 - bruno desthuilliersobject
继承以获得一个“新式”类,它将正确支持计算属性和super()
调用。 - bruno desthuilliers