【问题标题】:Python: separate utilities file or use static methods?Python:单独的实用程序文件或使用静态方法?
【发布时间】:2021-06-05 22:30:33
【问题描述】:

在 python 中,我有 getter 和 setter,并计算实用程序。 getter 返回属性,setter 设置属性,并且计算实用程序是使用参数计算内容的函数。例如

obj.property = calculate_property(arguments)

但是,有多种方法可以实现calculate_property,它可以

  1. 成为班级calculate_property(self) 的一员并返回_property
  2. 它可以是一个独立的函数,可以移动到一个单独的文件中
  3. 可能是静态方法

我对 1) 的问题是,calculate_property 的参数可能会被隐藏,因为它们可能包含在对象本身中,并且不可能在对象之外使用该函数。在 2 和 3 中,calculate 的功能形式被保留,但命名空间不同。

因此,出于这个原因,我排除了 1)。

如果我选择 2),好处是我可以将所有实用程序拆分为小文件,例如utility_a.py、utilities_b.py 并将它们作为模块导入。

如果我选择 3),函数会保留在同一个文件中,从而使其整体更长,但函数封装得更好。

在 2) 和 3) 之间首选哪个?还是我错过了其他解决方案?

【问题讨论】:

  • 1 是不可能的,因为您已经说过数据被埋没了;同时,我会选择3 而不是2,因为它看起来对你的类非常亲密(它创建了它的属性)并且可以作为帮助者。
  • 这是实现23example。只需记住将self 添加到签名中,如上所述,您可以将类方法和静态方法放在另一个文件中,然后仅根据需要导入。

标签: python oop functional-programming namespaces static-methods


【解决方案1】:

您可以通过这个将静态方法添加到在单独文件中定义的类的示例来实现23

helper.py:

def square(self):
    self.x *= self.x

fitter.py:

class Fitter(object):
    def __init__(self, x: int):
        self.x = x
    from helper import square

if name == '__main__':
    f = Fitter(9)
    f.square()
    print(f.x)

输出:

81

改编自 answer,它为类方法执行此操作。似乎也适用于静态方法。

【讨论】:

  • 哇,这真的很酷!在类定义中导入会将其添加到类命名空间中。这就是我喜欢静态方法和保持文件分开的原因。但是,我同意您在策略 3 上的评论,尽管文件的长度变得很长,但可能是最清楚的。
  • @Cody 我也觉得它很酷 :) 如果您觉得这个答案有用,请考虑接受它。谢谢。
  • @CodyAldaz 我已经在函数甚至类中使用了导入。 (例如 pdb.set_trace())。从未意识到 import 将对象设置到该名称空间中。很高兴知道。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
相关资源
最近更新 更多