something.new_attr = some_value
オブジェクトまたはクラスに存在しない属性を追加するのは、またはと同じくらい簡単setattr(something, 'new_attr', some_value)
です。オブジェクトまたはクラスに存在しないメソッドを追加するには、次の関数のいずれかを呼び出します。
def add_method(target, method_name):
"""add class method to a target class or attach a function to a target object"""
setattr(target, method_name, types.MethodType(lambda x:x, target))
def add_instance_method(target, method_name):
"""add instance method to a target class"""
setattr(target, method_name, types.MethodType(lambda x:x, None, target))
ここでadd_method(Something, 'new_method')
、(ダミーの) クラスレベルの 'new_method' を classSomething
に追加し、 'new_method' をtypeadd_method(something, 'new_method')
のオブジェクトに追加します(しかし の他のインスタンスには追加しません)、インスタンスレベルの 'new_method' をクラスに追加します(つまり、利用可能なのすべてのインスタンスに対して)。something
Something
Something
add_instance_method(Something, 'new_method')
Something
Something
注: 上記は、属性を持たない__dict__
インスタンス (組み込みクラスのインスタンスなどobject
) では機能しません。
stackoverflow に関する他の質問を確認してください: 既存のオブジェクト インスタンスにメソッドを追加する