我想做这样的事情:
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,我宁愿让每个类决定返回什么.
谢谢.
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)
| 归档时间: |
|
| 查看次数: |
567 次 |
| 最近记录: |