最佳实践python类

Nat*_*men 5 python oop class

我有一些看起来大致像的代码

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`"""
Run Code Online (Sandbox Code Playgroud)
  1. 在我的里面有代码不__init__好吗?

  2. 如果我有一个方法可以生成一些与类实例相关的数据,让用户调用该方法并存储数据,还是让一个实例变量在实例化时存储它是更好的做法?

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

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

Pas*_*cal 6

在我的init 中有代码不好吗?

不。但是如果它做了任何复杂的事情,把代码分解成一个函数/方法,就像你对 calc 所做的那样。只有当该方法的唯一调用者是构造函数时,我才建议您使用_calc代替calc。这样,您就向班级的用户发出信号,他们不打算_calc自称。

挑剔:

if c:
   self.data = self.calc(b, c)
Run Code Online (Sandbox Code Playgroud)

我会警惕这段代码,因为如果 c 是 None(或 0,或 False),则 self.data保持未设置。因此,您的所有其余方法都必须检查该data属性是否存在。写出来可能更好

self.data = self.calc(b, c) if c is None else None
Run Code Online (Sandbox Code Playgroud)

或者你可以将 None 的检查移到calc方法中,并在构造函数中说

self.data = self.calc(b, c)
Run Code Online (Sandbox Code Playgroud)

让用户调用该方法是更好的做法吗

我认为这取决于确切的用例。如果每个实例代表一个特定的数据集,并且不需要将一组数据交换为另一组数据,我会说构造函数这样做更有意义。这样,数据就被实例很好地封装了,用户不会因为不应该改变的数据而犯愚蠢的错误。