0

クラスを仮定しましょう:

class Something():
    def first(self):
        return None

このクラスを Mock オブジェクトに置き換える必要がありますが、存在しない属性を呼び出すか追加する必要があります。やってみると

fake = flexmock(Something, new_method=lambda:None)

受け取りAttributeErrorます。

存在しない属性またはメソッドを追加することは可能ですか?

4

1 に答える 1

1

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 に関する他の質問を確認してください: 既存のオブジェクト インスタンスにメソッドを追加する

于 2013-01-01T13:30:50.690 に答える