6

似たような質問(Python2に関連:Python:メソッドが静的かどうかを確認してください)

次のクラス定義を考えてみましょう。

class A:
  def f(self):
    return 'this is f'

  @staticmethod
  def g():
    return 'this is g'

Python 3にはinstancemethodもう存在せず、すべてが機能しているため、Python2に関連する答えは機能しなくなります。

私が言ったように、すべてが関数なので、呼び出すことはできますA.f(0)が、もちろん呼び出すことはできませんA.f()(引数の不一致)。しかし、インスタンスを作成し、Pythona=A()を呼び出すと、最初の引数として関数に渡されます。呼び出すと、送信が妨げられたり、キャプチャされたりします。したがって、これがstaticmethodであるかどうかをテストする方法が必要です。a.f()A.fselfa.g()self

では、メソッドが宣言されているかどうかをPython3でチェックインできstaticますか?

4

3 に答える 3

10
class A:
  def f(self):
    return 'this is f'

  @staticmethod
  def g():
    return 'this is g'
print(type(A.__dict__['g']))
print(type(A.g))

<class 'staticmethod'>
<class 'function'>
于 2013-01-07T00:08:11.167 に答える
5

Python 3.2以降の場合inspect.getattr_static()は、記述子プロトコルを呼び出さずに属性を取得するために使用します。

記述子プロトコルを介して動的ルックアップをトリガーせずに属性を取得する、__getattr__()または__getattribute__()

結果に使用isinstance(..., staticmethod)

>>> from inspect import getattr_static
>>> isinstance(getattr_static(A, 'g'), staticmethod)
True

この関数はインスタンスとクラスの両方を処理でき、クラス階層全体をスキャンします。

>>> class B(A): pass
...
>>> isinstance(getattr_static(B, 'g'), staticmethod)  # inherited
True
>>> isinstance(getattr_static(B(), 'g'), staticmethod)  # instance, inherited
True
于 2018-05-20T12:24:11.530 に答える
4

私はこの解決策が必要で、@rootからの回答に基づいて次のように書きました

def is_method_static(cls, method_name):
    # http://stackoverflow.com/questions/14187973/python3-check-if-method-is-static
    for c in cls.mro():
        if method_name in c.__dict__:
            return isinstance(c.__dict__[method_name], staticmethod)
    raise RuntimeError("Unable to find %s in %s" % (method_name, cls.__name__))
于 2016-05-10T19:16:59.250 に答える