クラスを仮定しましょう:
class Something():
def first(self):
return None
このクラスを Mock オブジェクトに置き換える必要がありますが、存在しない属性を呼び出すか追加する必要があります。やってみると
fake = flexmock(Something, new_method=lambda:None)
受け取りAttributeErrorます。
存在しない属性またはメソッドを追加することは可能ですか?
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' をクラスに追加します(つまり、利用可能なのすべてのインスタンスに対して)。somethingSomethingSomethingadd_instance_method(Something, 'new_method')SomethingSomething
注: 上記は、属性を持たない__dict__インスタンス (組み込みクラスのインスタンスなどobject) では機能しません。
stackoverflow に関する他の質問を確認してください: 既存のオブジェクト インスタンスにメソッドを追加する