2017-12-24 18 views
0

考えてみましょう:@のclassmethod` `なしでクラスメソッドを使用して

class cla(object): 
    def __init__(self,val): 
     self.val = val 

    def met(self): 
     return self.val + 1 

その後cla.met(cla(1))戻り2を。

メソッドmetを使用するためにクラスclaのインスタンスは必要ないので、これはデコレータを使用していないのにクラスメソッドであることを意味しますか?@classmethod

私はhttps://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methodsを読んでどのようなクラスメソッドが良いか理解していますが、なんとか@classmethodという意図された意味が既にクラスの通常のメソッドに存在しているように見えます。彼らはコンパイルさえしていないからです。あなたはクラスclaのインスタンスがある場合は

+0

多少の関連https://stackoverflow.com/questions/12935241/python-call-instance-method-using-func –

答えて

1

は:

instance = cla(1) 

を次に以下の二つの呼び出しは等価です:あなたはそれをvalで引数を渡す場合は、2番目にのみ動作することを

instance.met() 
cla.met(instance) 

注意実際にを実行するとはクラスclaのインスタンスに似ていますが、最初に暗黙的にクラスで定義された関数を呼び出し、自身を引数。 docs on method objectsを参照してください。

>>> f = cla.met 
>>> m = instance.met 
>>> type(f) 
<class 'function'> 
>>> type(m) 
<class 'method'> 
>>> m.__self__ == instance 
True 
>>> m.__func__ == f 
True 

ので

>>> f(instance) 
2 

instance.met()別名(別名 m()ある
>>> m.__func__(m.__self__) 
2 

と同じです。次の行は、メソッドオブジェクトの内部にいくつかの光を当てる助けることができますm.__call__())がフードの下にあります。

1

cla.met(cla(1))は、ちょうどcla(1).met()という畳み込み方法です。答えは単純にnoです:metはクラスメソッドではありません。

クラスメソッドでは、この違いを明確に希望

cla.met(1)と呼ばれるであろう

class cla(): 
    @classmethod 
    def met(cls, val): 
     return val + 1 

あろう。

関連する問題