3

SOには、クラスメソッドと静的メソッドを使用する理由/時期についていくつかの良い説明がありますが、装飾なしで静的メソッドを使用する場合の答えを見つけることができませんでした。このことを考慮

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

私がここで読んだことから、staticmethodを使用する主な理由は、基本的に概念的に類似したものを一緒に保つことです。上記の例から、両方のソリューションがそれを行っているように見えます。唯一の欠点は、インスタンスからnon-staticメソッドを呼び出せないように見えることです。たぶん私は他のプログラミング言語に慣れすぎているかもしれませんが、これはそれほど気になりません。Pythonのamインスタンスからクラスレベルのものを呼び出すことができるのはいつも驚くべきことです。

それで、これは基本的に2つの間の唯一の違いですか?それとも私は他の利点を逃していますか?ありがとう

4

1 に答える 1

2

Python3を使用しているようです。Python2の場合:

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'
于 2013-03-10T00:28:05.057 に答える