2011-08-18 15 views
7

私はPythonではすべてがオブジェクトへの引数としてメソッドに渡すことができるということを知っています。しかし、私はこれがどのくらい正確に機能するのかを理解しようとしています。だから私は次の例を試していた:引数としてのPythonメソッド

class A: 

    def __init__(self): 
     self.value = 'a' 

    def my_method(self) 
     print self.value 

class B: 

    def __init__(self): 
     self.values = 'b' 

    def my_method(self, method): 
     method() 

a = A() 
b = B() 
b.my_method(a.my_method) 

これは物事がどのように動作するかを見るために書かれた。私は、たとえばmy_methodの引数が呼び出し可能かどうかを確認する必要があることを知っています。今私の質問は:

ここでどのようにメソッドが正確に渡されますか?私は受け取っている出力が 'a'なので、オブジェクトメソッドがパラメータとして渡されたときに実際のオブジェクトがあると思いますか?この場合、a.my_methodを渡すと、インスタンスaも渡されますか?

+2

もしあなたがPython 2を使っているのであれば、 'class A:'ではなく 'class A(object):'を使って、新しいスタイルのクラスを得るのが一般的です。 –

答えて

8

あなたはa.my_method Pythonは、それはクラスの属性であり、そのA.my_methodメソッド__get__()を持っているので、それはその方法がA.my_methodへの参照の両方を含む新しいオブジェクト(「バインドされたメソッドを」)を作成、A.my_method.__get__(a)を呼び出すことを認識アクセスa自体を参照してください。バインドされたメソッドを呼び出すと、コールはそのメソッドに戻されます。

これは、直接呼び出すか、コード内で実際の呼び出しを遅延させるかにかかわらず、どのメソッドを呼び出すたびにも発生します。記述子プロトコルの詳細は、http://docs.python.org/reference/datamodel.html#descriptors

+0

入力していただきありがとうございます。あなたがそれに慣れるまで、Pythonは扱いにくいかもしれません:D – Bogdan

4

ここでメソッドがどのように正確に渡されますか?

これは簡単に答えています:Pythonではすべてがオブジェクトです。関数/メソッド(パラメータとして渡すことができる特定の関数オブジェクト)。

この場合、a.my_methodを渡すと、インスタンスaも渡されますか?

はい、この場合、インスタンスオブジェクトaは渡されますが、関数オブジェクトに埋め込まれていても取得できません。それどころか、関数自体を渡してインスタンスを提供することができます。次の例を考えてみましょう:

b = B() 
func = A.my_method # Attention, UPPERCASE A 
func(b) 

これはBのインスタンスとAクラスメソッドmy_methodを呼び出します。

+0

厳密に言うと、A.my_methodは関数自体ではなく、* unbound *メソッドオブジェクトです。 a.my_methodは* bound *メソッドオブジェクトです。実際に(モジュールを調べる)必要がある場合は、a.my_methodからインスタンスと元の関数を取得することができますが、ここでそれを行う理由はわかりません。 –

+0

私はあなたの提案を試みましたが、A.my_methodがobj引数を持つ静的メソッドだった場合にのみ有効でした。それ以外の場合は、Aのインスタンスが必要です。 – Bogdan

1

で見つけることができます。関数はPythonでは「ファーストクラスのオブジェクト」です。つまり、関数はリストや整数のようなオブジェクトです。関数を定義すると、実際に関数オブジェクトをdefで使用する名前にバインドしています。

関数は、他の名前にバインドすることも、関数にパラメータとして渡すことも(リストに格納するなど)行うこともできます。

ソース:http://mail.python.org/pipermail/tutor/2005-October/042616.html

1

a.my_method戻っていないあなたは(あなたがA.my_method経由でそれを得ることができます)class Aで定義されているが、オブジェクトは元の関数(または「結合していないメソッドの両方が含まれている「限定法」と呼ばれ、正確に機能'in Python 2、IIRC)と、それが取得されたオブジェクト(self引数)。

関連する問題