我应该使用静态方法还是使用top

我来自Java背景,我是python的新手。 我有几个脚本共享一些与读写文件相关的应用程序特有的辅助函数。 一些与阅读有关的功能,一些与写作有关。 在搜索正确的方法时,我看到了这个:Python中的静态方法?

他在回答中提到:

最后,谨慎使用静态方法! 有很少的情况需要在Python中使用静态方法,并且在单独的“顶层”函数更清晰的情况下,我已经看到它们被多次使用。

我不太了解顶层函数,我不确定给出这个更好的简单例子:1)为具有静态阅读器功能的读者创建一个类,对于作者也是如此,或者2)声明这些帮助者作为全球功能,为什么?

编辑:关于这个问题真的很好的文章,我刚刚发现http://tomayko.com/writings/the-static-method-thing


在Java中,有一种(恕我直言)错误的想法,即使只是将不共享任何状态的静态函数(因此这些类永远不会实例化)组合在一起,而是随处使用类。

Python在这里有所不同; 如果你的函数没有共享state1(因此在Java中通常是static函数)并且与“真实”类(=实际实例化的类)没有紧密关联,那么你只需在模块。

这背后的原因是,只有当你真的想实例化一个类时,才需要类,因此有一个类就像一个容器一样,不需要共享一个实例特定状态的几个函数就没有用处。

实际上,你可以将模块想象成一个static类 - 即一个函数(静态方法),模块变量(=静态字段)和类型的容器。

Python中的好处在于,顶层函数不会导致全局名称空间污染问题,因为在Python中,顶级函数/ objects / ...仍然是模块范围的。 因此,您仍然可以通过模块对功能进行分组,而不需要不必要的class -tax。


  • 实际上,它们可以有一些共享状态,以模块级变量的形式(如单身)。 再次,类比模块 - 静态类似乎持有。

  • 从Python的Zen( import this ):

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

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

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


    这是命名空间污染的问题。 如果你有一个包含多个类和一些只对某个类及其后代有意义的函数的模块,那么就建立一个静态方法。 静态方法可以通过使用类名称或通过使用类的对象来调用。

    >>> 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
    >>>
    
    链接地址: http://www.djcxy.com/p/55139.html

    上一篇: should I use static methods or top

    下一篇: Calling static method in python