2

Pythonでは、クラスからだけでなく、インスタンスからも静的メソッドを呼び出すことができます。

class X:
  @staticmethod
  def f():
    print('f')

x = X()
X.f() 
x.f() # same as above

これは、操作するインスタンスしかない場合に便利です。結局のところ、x.__class__.f()の代わりに書きたい人x.f()

しかし、コードの多くの読者(私を含む)はx.f()、それがインスタンスメソッドであるかのように解釈する傾向があることがわかりました。つまり、実行されるものはすべて、を使用または変更すると想定しますx。場合によっては、これによりバグが発生することもありました(開発者がのセマンティクスを誤って解釈した場合f)。

そのため、すべての静的メソッドがクラスオブジェクトのみを使用して呼び出されるという規則を採用することを考えていました。この規則に違反した場合に警告する静的分析ツールはありますか?

4

1 に答える 1

3

この量の静的チェックはpythonicではないと思いますが...

class enforced_staticmethod(staticmethod):
     def __get__(self, instance, cls):
         if instance is not None:
             raise Exception('Do not call with an instance.')
         return super(enforced_staticmethod, self).__get__(self)


class C:
    @enforced_staticmethod
    def hai(x):
        return x + 1

そして、あなたはテストすることができます:

>>> C.hai(10)
11
>>> C().hai(10)
Traceback (most recent call last):
  File "<pyshell#52>", line 1, in <module>
    C().hai(10)
  File "<pyshell#48>", line 4, in __get__
    raise Exception('Do not call with an instance.')
Exception: Do not call with an instance.
于 2012-10-12T01:17:04.087 に答える