2016-04-22 14 views
3

staticmethod s「は単なる機能」であり、私は2つの異なる方法でそれらを参照することができますPython classmethods:インスタンスのメンバとクラスのメンバの違いは何ですか? Pythonでは

>>> class A: 
...  @staticmethod 
...  def f(): 
...   pass 
... 
>>> a=A() 
>>> A.f 
<function A.f at 0x7f20f8cd3f28> 
>>> a.f 
<function A.f at 0x7f20f8cd3f28> 
>>> a.f is A.f 
True 

a.fA.fの両方がちょうど」であることを起こる同じオブジェクトを参照名、あります機能"。すばらしいです。

>>> class B: 
...  @classmethod 
...  def f(cls): 
...   pass 
... 
>>> b=B() 
>>> b.f is B.f 
False 

私はb.fB.fないの機能があることを知っている:彼らはバインドmothods

は今、classmethod私が持っていると言います。これは、cls引数が暗黙的であり、常にBに等しいことを意味します。このため、B2Bのサブクラスである場合、異なるcls引数を持つバインドされたメソッドであるため、B2().f is B().fはfalseになります。しかし、私はなぜB().f is B.fFalseをもたらすのか分からない。 A().fA.fのように、同じオブジェクトではありませんか?

EDIT:この質問は「What is the difference between @staticmethod and @classmethod in Python?」と同じではありません。私はstaticmethodclassmethodの違いを知っています。私はリンクされている "傘"の質問には取り上げられていない1つの特定のことを知りたい。

+0

クラスは定義に似ています。 'インスタンス 'はその定義の実際の使用です。したがって、 'class'はレシピ、' instance'はケーキです。レシピはケーキではなく、ケーキの作り方に関する説明だけなので、同じではありません。 – DuckPuncher

+0

@DuckPuncherあなたは私の質問の本文を読みましたか? B().fがB.fである理由が偽であり、A().fがA.f'が真である理由を知りたい。 – fonini

+1

「ユーザー定義メソッド」も参照してください。https://docs.python.org/2/reference/datamodel.html#types –

答えて

4

B().fB.fは、属性アクセスを介して非静的メソッドを参照するたびにPythonが新しいバインドメソッドオブジェクトを作成するため、異なるオブジェクトです。

たとえば、B.f is B.fFalseです。

>>> B.f is B.f 
False 

同様に、あなたはインスタンスが同じまま場合でも、新しいメソッドオブジェクトを取得します:

>>> b = B() 
>>> b.f is b.f 
False 

@staticmethodは、新しい静的メソッドオブジェクトを作成しますが、

た場合、静的メソッドオブジェクトがクラスまたはクラス インスタンスから取得された場合、実際に返されたオブジェクトはラップされたオブジェクトであり、それ以上の変換が行われない ですに。この場合にはA.f

Data modelから)

は常に同じf関数オブジェクトを返します。

+1

FWIW、 'b = B(); b.f is b.f'はfalseである。 –

関連する問題