如何正确创建实用程序类

时间:2013-10-27 16:37:00

标签: python class

我有一个文件,意味着是一个实用程序文件。 该文件应包含许多静态方法。

我应该用这种方式定义类中的方法:

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

    @staticmethods
    def method2(a,b,c):
        pass

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

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

def method2(a,b,c):
    pass

3 个答案:

答案 0 :(得分:27)

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

from utility import some_func

将导入您的功能。

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

事实上,你正在尝试做的事情已经完成了。你试图存储一些好的实用功能。好吧,python-requests是第三方库,大多数Pythonistas都喜欢这样做。它将其良好的实用功能存储在一个单独的模块中。 Here is the example.

答案 1 :(得分:17)

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

  • 如果你只有数据,没有方法,它可能应该是namedtuple,而不是class,除非你需要在创建数据后修改它。
  • 如果函数访问实例数据,则它应该是一种方法。
  • 如果某个函数不访问实例数据,但访问类数据,则该函数应为@classmethod
  • 如果一个函数既不访问实例数据也不访问类数据,它应该是一个独立的函数,除非有一些非常有说服力的理由使它成为@staticmethod
  • 如果class只有一个方法,或者除__init__()之外只有一个方法,那么您几乎可以并且应该将其重写为函数。

课程很容易被滥用,但是应该避免将所有东西都推到课堂上的诱惑。你应该在它们有意义的时候使用它们,并且当它们没有时使用它们。

答案 2 :(得分:10)

虽然这个问题有点基于意见,但我会说第二个更好。它减少了冗余。使用第一种方法,您将不得不这样做:

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

或:

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

然后使用第二个允许您简单地执行:

import utility
utility.method1(...)

或:

from utility import method1
method1(...)

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