最佳实践python类

时间:2017-09-07 14:24:42

标签: python class oop

我有一些类似于

的代码
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`"""
  1. __init__

  2. 中包含代码是不是很糟糕
  3. 如果我有一个方法可以生成一些与类实例相关的数据,那么最好让用户调用该方法并存储数据,还是让其中一个实例变量在实例化时存储它?

  4. 2的原因是因为我有这个类可以从一些json文件生成所有内容,所以该类只有一个实例变量和一堆方法吗?这甚至不应该是一个班级吗?我一直认为带有一个实例变量的类是不好的做法,但另一方面,我有一组函数都在同一个json文件上运行,所以他们觉得它们应该属于某个集团结构。 / p>

    编辑:作为第三个问题,与2相关,如果某些方法需要依赖于初始化数据计算数据的数据,该怎么办?所以在上面的例子中,假设我(用户)计算d=2*a+b,因为我感兴趣。然后我想做另一个计算,如果我给它d理论上会加速。所以这个方法看起来像new_calc(self, d)。我最初计算时应该在课堂上存储d,然后不要问用户,还是应该让他们更负责任?

1 个答案:

答案 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)
  

让用户调用该方法

是更好的做法

我认为这取决于确切的用例。如果每个实例代表一个特定的数据集,并且不需要为另一个实例交换一组数据,我说这对构造函数来说更有意义。通过这种方式,实例可以很好地封装数据,并且当用户不应该更改数据时,用户不会犯一个愚蠢的错误。