python-我应该使用静态方法还是顶级函数

2024-05-29 05:02:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我来自Java背景,对python还不熟悉。我有两个脚本,它们共享一些与读写文件相关的应用程序特有的帮助函数。有些功能与阅读有关,有些功能与写作有关。在寻找正确的方法时,我看到了这个:Static methods in Python?

他在回答中提到:

Finally, use staticmethod sparingly! There are very few situations where static-methods are necessary in Python, and I've seen them used many times where a separate "top-level" function would have been clearer.

我不太了解顶级函数,我不确定给出这个简单的例子哪个更好:1)为具有静态读卡器函数的读卡器创建一个类,对写卡器也是这样;或者2)将这些帮助器声明为全局函数,为什么?

编辑:关于这个主题的好文章我刚刚找到了http://tomayko.com/writings/the-static-method-thing


Tags: 文件方法函数in功能脚本应用程序static
3条回答

这是一个名称空间污染的问题。如果有一个模块有多个类和一些只对某个类及其子类有意义的函数,则将其设为静态方法。静态方法可以通过使用类名或使用类的对象来调用。

>>> class A(object):
...     @staticmethod
...     def static_1():
...             print 'i am static'
...     def a(self):
...             self.static_1()
...
>>> A.static_1()
i am static
>>> a=A()
>>> a.a()
i am static
>>> a.static_1()
i am static
>>> class B(A):
...     pass
...
>>> b=B()
>>> b.static_1()
i am static
>>>

在Java中,在任何地方使用类都是错误的,甚至只是将不共享任何状态的静态函数组合在一起(这样类就永远不会被实例化)。

这里的Python有所不同;如果您的函数没有一些共享的state1(因此在Java中通常是static函数),并且与“real”类(实际上是实例化的类)没有紧密联系,那么您只需在模块中使用自由函数。

这背后的原因是,只有当您真正想要实例化一个类时,才需要该类,因此将一个类作为几个不需要共享实例特定状态的函数的容器是无用的。

实际上,您可以将模块看作是一个static类,即一个包含函数(=静态方法)、模块变量(=静态字段)和类型的容器。

Python的好处是拥有顶级函数不会带来全局命名空间污染问题,因为在Python中,顶级函数/对象/。。。仍然是模块作用域。因此,您仍然可以按模块对函数进行分组,而无需缴纳不必要的class税。


  1. 实际上,它们可以以模块级变量(so,singleton)的形式拥有一些共享状态;同样,类比模块静态类似乎可以保持。

来自Python的禅(import this):

Namespaces are one honking great idea -- let's do more of those!

在Java这样的语言中创建静态方法的主要原因之一是确保这些方法不会最终污染全局命名空间。(尽管Java通过完全禁止“包级别”函数来强制执行自己的命名空间约定!)在Python中,所有“顶级”函数都自动放在包含这些函数的模块的名称空间中,因此不存在这样污染全局名称空间的危险。

换句话说,与许多其他语言一样,Python可以用几种不同的方式创建名称空间。在这种情况下,当一个模块服务于相同的命名空间目的而没有与定义类相关的混乱(或认知负载)时,几乎不需要创建一个只包含静态方法的类。

相关问题 更多 >

    热门问题