如何正确创建实用程序类



我有一个文件,它本来是一个实用程序文件。该文件应包含许多静态方法。

我应该这样定义类中的方法吗:

#utility.py
class utility(object):
    @staticmethod
    def method1(a,b,c):
        pass
    @staticmethod
    def method2(a,b,c):
        pass

或者像这样使用它(没有类):

#utility.py
def method1(a,b,c):
    pass
def method2(a,b,c):
    pass

第二个选项是 Python 中的作案手法。我的意思是,如果你所做的只是导入函数,那么你可以做这样的事情:

from utility import some_func

这将导入您的函数。

最佳实践是,如果您只使用静态函数,那么只需将它们放在单独模块的全局命名空间中,这将使您的生活更加轻松。您要做的是创建对象并用静态方法填充它们。当您可以在.py文件中定义函数时,为什么要这样做?

事实上,你想做的事情已经完成了。您正在尝试存储一些好的实用程序函数。好吧,python-requests ,是一个第三方库,只是被大多数 Python 主义者所崇拜,只是这样做。它将其良好的实用程序函数存储在一个单独的模块中。下面是示例。

类封装数据和行为,因此作为一般规则:

  • 如果你有一些东西只有数据,没有方法,它可能应该是一个namedtuple,而不是一个class,除非你需要在创建数据后修改它。
  • 如果函数访问实例数据,它应该是一个方法。
  • 如果函数不访问实例数据,但访问类数据,则它应该是@classmethod
  • 如果一个函数既不访问实例数据也不访问类数据,它应该是一个独立的函数,除非有一些真正令人信服的理由让它成为@staticmethod
  • 如果一个class只有一个方法,或者除了__init__()之外还有一个方法,那么你几乎可以肯定可以而且应该把它重写为一个函数。

类真的很容易被滥用,但真正应该避免将所有内容都塞进课堂的诱惑。您应该在它们有意义时使用它们,并在它们没有意义时使用它们时避免使用它们。

虽然这个问题有点基于意见,但我会说第二个更好。 它减少了冗余。 使用第一种方法,您将必须执行以下操作:

import utility
utility.utility.method1(...)

或:

from utility import utility
utility.method1(...)

但是,使用第二个可以让您简单地执行以下操作:

import utility
utility.method1(...)

或:

from utility import method1
method1(...)

如果你正在创建一个只包含静态方法的类,我的问题是"你为什么需要这个类? 它在这里没有任何积极贡献。

最新更新