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

How to inject meta data in existing object

有时,我需要更改现有方法行为或注入元数据以进行测试。比如:我们有 2 个预定义的 类,我们无法更改(我们可以实现 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

事实证明,我应该使用 __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__))