只是在字典“类型”子类遇到问题。我没有覆盖__iter__方法和预期会影响其他的方法,如出iterkeys,钥匙等,因为我相信他们称之为__iter__方法来获取值,但似乎他们是独立实现,我要重写所有的人。

这是一个错误或意图他们不使用其他方法和检索值分别?

我没有呼叫依赖标准类的方法之间的标准Python文档描述找到。这将是得心应手sublassing工作和需要什么样的方法来覆盖适当的行为取向。有大约蟒基类型/类内部一些补充文档?

有帮助吗?

解决方案

子类MappingMuteableMapping集合模块而不是dict,你会得到所有这些方法是免费的。

下面是一个最小的映射的一个例子和一些方法你获得免费:

import collections
class MinimalMapping(collections.Mapping):
    def __init__(self, *items ):
        self.elements = dict(items)
    def __getitem__(self, key):
        return self.elements[key]
    def __len__(self):
        return len(self.elements)
    def __iter__(self):
        return iter(self.elements)

t = MinimalMapping()
print (t.iteritems, t.keys, t.itervalues, t.get)

要继承的任何内建容器的你应该总是使用适当的基类从集模块。

其他提示

如果在文档中没有指定,它是实现特定的。实现其他的是CPython中可能会重新使用iter方法来实现iterkeys等。我不认为这是一个错误,而只是为实现者一点自由的。

我怀疑有一个业绩因素在独立地实现这些方法,尤其是作为字典被如此广泛使用在Python。

所以基本上,你要实现它们。

您知道说:“你知道,当你认为会发生什么。” :-)

他们没有正式文件证明的东西,因为他们可能会决定改变它的未来。您可能会发现任何非官方的文件只会记录一个Python实现的当前行为,并依托它会导致你的代码是非常,非常脆弱。

当有特殊的方法的正式文件,它往往用来描述相对于你自己的类,如使用__len__()__nonzero__()不落实,或者只需要__lt()__排序解释的行为。

由于Python使用鸭打字,你平时不从实际需要继承一个内置的类来使自己的类的行为像一个。所以,你可能会重新考虑是否继承dict是你想要做的真的是。您可以选择不同的类,如从collections模块的东西,或者封装而不是继承。 (该UserString类使用的封装。)或者从头刚开始。

而不是继承dict的,你可以,而不是仅仅创造使自己的类,它具有的究竟的你想没有太多麻烦的属性。这里有一个博客后对如何做到这一点的例子。在它的__str__()方法是不是最大的,但是这很容易纠正,其余提供你所寻求的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top