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')class 添加一个(虚拟)类级别的“new_method”,向类型的对象添加一个“new_method” (但不适用于 的其他实例),向类添加一个实例级别的“new_method” (即可用对于) 的所有实例。Somethingadd_method(something, 'new_method')somethingSomethingSomethingadd_instance_method(Something, 'new_method')SomethingSomething

注意:以上不适用于没有__dict__属性的实例(例如内置类的实例object)。

请检查stackoverflow上的另一个问题: 向现有对象实例添加方法

于 2013-01-01T13:30:50.690 回答