我设计了一个邪恶的方案,通过以下方式通过继承向 Python 对象添加标签:
def tag(val, tag_cls):
val_cls = type(val)
class tagged_cls(val_cls, tag_cls):
pass
tagged_cls.__name__ = '{}({})'.format(tag_cls.__name__, val_cls.__name__)
return tagged_cls(val)
# Example tags
class Foo: pass
class Bar: pass
def foo(val): return tag(val, Foo)
def bar(val): return tag(val, Bar)
所以我可以用这些包装值,它们在比较时会表现得与原始值完全一样,但会有额外的信息。
>>> k = foo('key')
>>> k
'key'
>>> k == 'key'
True
>>> {'key': 'value'}[k]
'value'
>>> isinstance(k, Foo)
True
>>> isinstance(k, Bar)
False
上面的工作,但我觉得这有点太聪明了,肯定有一种更 Pythonic 的方式来做到这一点。
有更好的办法吗?上述方法有什么问题吗?