【问题标题】:How to create a utility class correctly [closed]如何正确创建实用程序类 [关闭]
【发布时间】:2013-10-27 16:36:59
【问题描述】:

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

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

#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

【问题讨论】:

  • 函数最好定义为函数。如果你不需要一门课,就不要开课。
  • 这就是我正在寻找的答案:P
  • @PaulGriffiths 完全正确。 @Nirock 一个方法可以/应该实际上是一个函数的一个强有力的指标是它不使用它的 self 参数。像pylint 这样的工具甚至会检查它并给你一个提示。
  • +1 为 pylint,每个家庭都应该有一个。
  • 我喜欢崇高。我应该摆脱它吗?

标签: python class


【解决方案1】:

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

from utility import some_func

这将导入您的函数。

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

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

【讨论】:

  • 以 utility.method1(...) 方式使用它让我感觉更舒服。我应该强迫自己这样做吗?我真的很想使用最佳实践。
  • 绝不在生产代码中使用from foo import *。这使得无法跟踪导入的来源,并且可能掩盖内置名称。
  • 最好的做法是,如果您只使用静态函数,那么只需将它们放在单独模块的全局命名空间中,这会让您的生活变得更轻松。
  • 如果不是每个包的__init__.py,每秒打开一次,你会发现from foo import *
  • @alko 不同的是:这是故意使用import * 定义__all__ 的包,正是为了防止人们使用from package import *(他们不应该)导入不需要的东西。另外:仅仅因为你仍然经常看到它(NumPy,我在看着你)并不意味着这是一个好主意。
【解决方案2】:

类封装了数据和行为,就像一般规则:

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

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

【讨论】:

【解决方案3】:

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

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

或:

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

然而,使用第二个可以让你简单地做:

import utility
utility.method1(...)

或:

from utility import method1
method1(...)

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

【讨论】:

  • 旧线程,但是如果您能够在逻辑上将许多实用功能组合在一起会怎样?您可以制作几个实用模块(例如my_time_utils.pymy_string_utils.py 等),这对于一些大集合来说非常有用。但是,许多小型收藏品呢?那么以类的形式(例如PunctuationTranslationSpellCheck 等)将逻辑分隔符放在my_string_utils.py 模块中是否有意义?因此,您将拥有 from my_string_utils import Punctuation ... Punctuation.fix_commas(text) 那么,只需在一个 util 模块中使用类吗?
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2012-07-25
  • 2016-03-20
  • 2017-10-10
相关资源
最近更新 更多