gpt4 book ai didi

python - 最佳实践 python 类

转载 作者:太空宇宙 更新时间:2023-11-03 15:51:53 25 4
gpt4 key购买 nike

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

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. 如果我有一个生成一些与类实例相关的数据的方法,最好的做法是让用户调用该方法并存储数据,还是让实例变量之一在实例化时存储它?

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

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

最佳答案

Is it bad to have code within my 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)

is it better practice to leave the user to call that method

我认为这取决于确切的用例。如果每个实例都代表一个特定的数据集,并且没有必要将一组数据换成另一组数据,我认为构造函数这样做更有意义。这样,数据就很好地封装在实例中,用户不会在不应该更改的时候更改数据而犯下愚蠢的错误。

关于python - 最佳实践 python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46098852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com