让我们假设上课:
class Something():
def first(self):
return None
我需要用Mock对象替换这个类,但我需要调用或添加不存在的属性。当我尝试
fake = flexmock(Something, new_method=lambda:None)
我收到AttributeError
。
是否可以添加不存在的属性或方法?
答案 0 :(得分: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')
会向班级Something
添加(虚拟)班级“new_method”,add_method(something, 'new_method')
会向对象something
添加“new_method” Something
(但不适用于Something
的其他实例),add_instance_method(Something, 'new_method')
会将实例级“new_method”添加到类Something
(即可用于{{1}的所有实例1}})。
注意:上述内容不适用于没有Something
属性的实例(例如内置类__dict__
的实例)。
请检查stackoverflow上的其他问题:Adding a Method to an Existing Object Instance