如果不使用 dict 的子类,一个类想要被视为映射(mapping)并且可以被传递给带有 **
参数的方法,需要满足什么条件?
from abc import ABCMeta
class uobj:
__metaclass__ = ABCMeta
uobj.register(dict)
def f(**k): return k
o = uobj()
f(**o)
# outputs: f() argument after ** must be a mapping, not uobj
至少要让它抛出映射功能缺失的错误,这样我才能开始实现。我已经查看了模拟容器类型的内容,但仅定义魔术方法没有效果,并且使用
ABCMeta
来覆盖并将其注册为字典会将其断言为子类,但在使用 isinstance(o, dict)
时失败。理想情况下,我甚至不想使用 ABCMeta
。