为什么使用staticmethod而不是装饰器?

关于为什么/何时应该使用类方法vs静态方法,有几个很好的解释,但是我一直无法找到什么时候使用静态方法而没有装饰的答案。 考虑这一点

class Foo(object):        
    @staticmethod
    def f_static(x):
        print("static version of f, x={0}".format(x))

    def f_standalone(x):
        print("standalone verion of f, x={0}".format(x))

还有一些输出:

>>> F = Foo
>>> f = F()
>>> F.f_static(5)
static version of f, x=5
>>> F.f_standalone(5)
standalone verion of f, x=5
>>> f.f_static(5)
static version of f, x=5
>>> f.f_standalone(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f_standalone() takes 1 positional argument but 2 were given

从我在这里阅读的内容来看,使用静态方法的主要原因基本上是保持概念上类似的东西在一起。 从上面的例子来看,似乎两种解决方案都是这样做的。 唯一的缺点是你看起来不能从实例中调用非静态方法。 也许我太习惯其他编程语言,但这并不会让我感到困扰; 总是令人惊讶的是,我可以从Python中的实例调用类级别的东西。

那么,这两者基本上是唯一的区别吗? 或者我错过了其他好处? 谢谢


你似乎在使用python 3.在python 2中:

In [1]: class Foo(object):
   ...:     def f_standalone(x):
   ...:         print("standalone version of f, x={}".format(x))
   ...:

In [2]: Foo.f_standalone(12)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-2d315c006153> in <module>()
----> 1 Foo.f_standalone(12)

TypeError: unbound method f_standalone() must be called with Foo instance as first argument (got int instance instead)

在python 3中,你错过了另一个奇怪的用例:

In [1]: class Foo(object):
   ...:     def f_standalone(x):
   ...:         print("standalone version of f, x={}".format(x))
   ...:     @staticmethod
   ...:     def f_static(x):
   ...:         print("static version of f, x={}".format(x))
   ...:

In [2]: Foo().f_standalone()
standalone version of f, x=<__main__.Foo object at 0x1064daa10>

In [3]: Foo().f_static()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-addf9c3f2477> in <module>()
----> 1 Foo().f_static()

TypeError: f_static() missing 1 required positional argument: 'x'
链接地址: http://www.djcxy.com/p/54145.html

上一篇: Why use staticmethod instead of no decorator at all

下一篇: Call a script after validation with jquery.validate.unobtrusive