2016-05-26 4 views
5

型モジュールのmethodtypesを使用する利点は何ですか?オブジェクトにメソッドを追加するために使用されます。しかし、我々はそれなしで簡単にそれを行うことができます。Pythonでmethodtypeを使用する利点

def func(): 
    print 1 

class A: 
    pass 

obj = A() 
obj.func = func 

それは我々がdel funcによってメインスコープでFUNCを削除しても動作します。

なぜメソッドタイプを使用したいのですか?それは単なる大会か良いプログラミングの習慣ですか?

+1

これは本当に 'obj'にメソッドを追加していません。 'obj.func()'は 'func()'だけを呼び出すのと同じです。メソッドは、インスタンスをposition引数として受け取ります。 'func .__ get __(obj、A)'で束縛されたメソッドを作成することもできますが、 'func'は引数を取らないので、どちらも機能しません。 –

+0

あなたの関数 'func'には' self'引数はありません。クラスの*メソッド*をアタッチしたり、置き換えたりするときは 'type'を使います。ここでは、*関数*をクラスに追加するだけです。 – Cyrbil

答えて

3

あなたの例では、巨大である 実行時に動的にメソッドを追加することとの違い:あなたのケースで

  • 、あなたはちょうどあなたが、もちろんそれを呼び出すことができ、オブジェクトに関数を付けるが、それはあります結合していない、それはオブジェクト自体MethodTypeを追加したとき
  • は、あなたがバインドメソッドを作成します(つまり、あなたが関数内selfを使用することはできません)とは関係がなく、それがオブジェクトに対して通常のPythonメソッドのように動作し、あなたは

最初の引数として、それはに属しているオブジェクトを取るために(それが正常にselfと呼ばれる)とは、関数の内部でそれにアクセスすることができます。この例では、違いを示しています

def func(obj): 
    print 'I am called from', obj 
class A: 
    pass 
a=A() 
a.func=func 
a.func() 

これはで失敗しますTypeErrorfunc() takes exactly 1 argument (0 given)、 予想通り、このコードが動作するのに対し:

import types 
a.func = types.MethodType(func, a, A) 
a.func() 

示すを。

+0

つまり、これは私がこれを使用したオブジェクトの属性を使用できないことを意味します。例えば、アトリビュートが定義されている場合、アトリビュートが「att」と言えば、それを正しく使用することはできません。 – Existent

+0

あなたの質問では、関数はオブジェクトから切り離されています。関数はメソッドではないので、関数からオブジェクトにアクセスする方法はありません。 – mguijarr

+0

@ABHIいいえ、どこからでも 'att'にアクセスできますが、アクセスするにはクラスのインスタンスが必要です(つまり、' att'自体は何も意味しません、 'obj.att'が必要です)。通常定義されたメソッド(したがってバインドされているメソッド)は、メソッドがバインドされているインスタンスである 'self'引数を取得し、適切な' att'に簡単にアクセスできます。 –

3

types.MethodTypeのよくある用途は、何らかのオブジェクトがメソッドであるかどうかをチェックしています。たとえば、次のように

>>> import types 
>>> class A(object): 
...  def method(self): 
...   pass 
... 
>>> isinstance(A().method, types.MethodType) 
True 
>>> def nonmethod(): 
...  pass 
... 
>>> isinstance(nonmethod, types.MethodType) 
False 

注あなたの例ではisinstance(obj.func, types.MethodType)戻りFalseいます。クラスAにメソッドmethを定義したとします。 isinstance(obj.meth, types.MethodType)Trueを返します。実際に

関連する問題