web-dev-qa-db-ja.com

PythonでMethodTypeを使用する利点

MethodTypeモジュールからtypesを使用する利点は何ですか?これを使用して、オブジェクトにメソッドを追加できます。しかし、それがなくても簡単にそれを行うことができます。

def func():
   print 1

class A:
   pass

obj = A()
obj.func = func

del funcを実行して、メインスコープのfuncを削除しても機能します。

なぜMethodTypeを使用したいのですか?それは単なる慣習ですか、それとも良いプログラミング習慣ですか?

20
Existent

実際、実行時に動的にメソッドを追加することとあなたの例の違いは非常に大きいです:

  • あなたの場合、オブジェクトに関数をアタッチするだけで、もちろんそれを呼び出すことができますが、それはnboundであり、オブジェクト自体とは関係ありません(つまり、関数内でselfを使用することはできません)
  • MethodTypeで追加すると、boundメソッドが作成され、通常のPythonオブジェクトのメソッドのように動作しますhave to最初の引数として属しているオブジェクト(通常は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) # or types.MethodType(func, a, A) for PY2
a.func()
_

_I am called from <__main__.A instance at xxx>_を示します。

19
mguijarr

_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を返すことに注意してください。クラスmethにメソッドAを定義したとします。 isinstance(obj.meth, types.MethodType)Trueを返します。

4
Manuel Jacob