52

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

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

#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
4

3 回答 3

39

第二个选项是 Python 中的作案手法。我的意思是,如果您所做的只是导入函数,那么您可以执行以下操作:

from utility import some_func

这将导入您的功能。

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

事实上,你想做的事情已经完成了。您正在尝试存储一些好的实用功能。嗯,python-requests是一个第三方库,只是被大多数 Pythonistas 所崇拜,它就是这样做的。它将其良好的实用功能存储在一个单独的模块中。这是示例。

于 2013-10-27T16:38:57.117 回答
25

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

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

类真的很容易被滥用,但是真的应该避免把所有东西都塞进一个类的诱惑。你应该在有意义的时候使用它们,而在没有意义的时候避免使用它们。

于 2013-10-27T16:51:51.023 回答
11

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

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

或者:

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

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

import utility
utility.method1(...)

或者:

from utility import method1
method1(...)

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

于 2013-10-27T16:39:58.163 回答