用于dict-able类的Python习语?

And*_*Lee 3 python abc

我想做这样的事情:

class Dictable:
    def dict(self):
        raise NotImplementedError

class Foo(Dictable):
    def dict(self):
        return {'bar1': self.bar1, 'bar2': self.bar2}
Run Code Online (Sandbox Code Playgroud)

是否有更多的pythonic方式来做到这一点?例如,是否可能使内置转换过载dict(...)?请注意,我不一定要返回所有成员变量Foo,我宁愿让每个类决定返回什么.

谢谢.

Fre*_*Foo 5

Pythonic方式取决于你想做什么.如果你的对象本身不应该被视为映射,那么一个dict方法就完全没问题,但是你不应该"重载" dict来处理dictables.你是否需要基类取决于你是否想要isinstance(x, Dictable); 请注意,hasattr(x, "dict")这几乎可以起到同样的作用.

如果类概念上是键值的映射,那么实现Mapping协议似乎是合适的.即,你实施

  • __getitem__
  • __iter__
  • __len__

并继承collections.Mapping来获取其他方法.然后你就dict(Foo())可以免费获得.例:

class Foo(Mapping):
    def __getitem__(self, key):
        if key not in ("bar1", "bar2"):
            raise KeyError("{} not found".format(repr(key))
        return getattr(self, key)

    def __iter__(self):
        yield "bar1"
        yield "bar2"

    def __len__(self):
        return 2
Run Code Online (Sandbox Code Playgroud)