MethodType
モジュールからtypes
を使用する利点は何ですか?これを使用して、オブジェクトにメソッドを追加できます。しかし、それがなくても簡単にそれを行うことができます。
def func():
print 1
class A:
pass
obj = A()
obj.func = func
del func
を実行して、メインスコープのfunc
を削除しても機能します。
なぜMethodType
を使用したいのですか?それは単なる慣習ですか、それとも良いプログラミング習慣ですか?
実際、実行時に動的にメソッドを追加することとあなたの例の違いは非常に大きいです:
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()
_
これはTypeError
:func() 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>
_を示します。
_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
を返します。