如何在现有对象中注入元数据
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__))
有时,我需要更改现有方法行为或注入元数据以进行测试。比如:我们有 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__))