如何在现有对象中注入元数据

时间:2017-10-11 22:38:44

标签: python testing mocking metaprogramming

有时,我需要更改现有方法行为或注入元数据以测试purpouses。比如:我们有两个我们无法更改的预定义类(我们可以实现SomeClass *以简化注入元数据)。

class A(SomeClass1):
    def __init__(self):
        last_id = self.id

class B(SomeClass2):
   def __init__(self):
        last_id = self.id

那么应该对下一行打印增加的id(例如:1 2 3)做什么?

print A().id, B().id, A().id

1 个答案:

答案 0 :(得分:0)

事实证明我应该使用 __ call __ 方法创建元类,并使用我的元类重新初始化类,如下例所示:

collector = 0


class IdMeta(type):
    def __call__(cls, *args, **kwds):
        global collector
        collector += 1
        cls.id = collector
        return type.__call__(cls, *args, **kwds)


A = IdMeta(A.__name__, A.__bases__, dict(A.__dict__))
B = IdMeta(B.__name__, B.__bases__, dict(B.__dict__))