2017-11-22 2 views
0

での静的および非静的することができ、私はこのクラスを考えてみましょう:関数はPythonの2

class Test(object): 
    def __init__(self, a): 
     self.a = a 

    def test(self, b): 
     if isinstance(self, Test): 
      return self.a + b 
     else: 
      return self + b 

これは、理想的には私の世界でこれを行うだろう:

>>> Test.test(1,2) 
3 
>>> Test(1).test(2) 
3 

は今、このはしていません

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

python3では、これはうまく動作し、これはpytのデコレータで可能ですhon2しかし、私のpython fooはそれを動作させるのに十分なほど強力ではありません。

プロットツイスト:静的に呼び出されていないときに何かが必要な場合はどうなりますか?

+1

おっとはちょうど '追加@:、あなた自身の記述子タイプは賢明かもしれクラスを書きますstaticmethod' decorator works ... – albertjan

答えて

4

@staticmethodと他の静的メソッドのように書くだけです。あなたは、インスタンス上で呼び出された場合、実際にselfを受け取ることになりますが、また、上の呼び出すことができます何かをしたい場合は

class Test(object): 
    @staticmethod 
    def test(a, b): 
     return a + b 

Demo.

:クラスでそれを呼び出すのと同じように働き、インスタンス上の静的メソッドを呼び出します

import types 

class ClassOrInstanceMethod(object): 
    def __init__(self, wrapped): 
     self.wrapped = wrapped 
    def __get__(self, instance, owner): 
     if instance is None: 
      instance = owner 
     return self.wrapped.__get__(instance, owner) 

class demo(object): 
    @ClassOrInstanceMethod 
    def foo(self): 
     # self will be the class if this is called on the class 
     print(self) 

Demo.

+0

しかし、オプションの 'self'パラメータを考慮に入れてください。 :) – albertjan

+1

@albertjan:インスタンスでインスタンスを呼び出す場合でも、静的メソッドは暗黙の 'self'を受け取らない。 – user2357112

+0

そして、私たちは感謝を学ぶ:)。 – albertjan