覆盖产生的方法

时间:2015-10-12 08:53:52

标签: python

我是Python 3概念的新手。

基类具有以下功能:

class DocumentFormatter(object):
    def transform_element(self, key, value):
        if isinstance(value, list):
            for li, lv in enumerate(value):
                for inner_k, inner_v in self.transform_element(
                        "%s.%s" % (key, li), lv):
                    yield inner_k, inner_v
        elif isinstance(value, dict):
            formatted = self.format_document(value)
            for doc_key in formatted:
                yield "%s.%s" % (key, doc_key), formatted[doc_key]
        else:
            # We assume that transform_value will return a 'flat' value,
            # not a list or dict
            yield key, self.transform_value(value)

    def format_document(self, document):
        def flatten(doc, path):
            top_level = (len(path) == 0)
            if not top_level:
                path_string = ".".join(path)
            for k in doc:
                v = doc[k]
                if isinstance(v, dict):
                    path.append(k)
                    for inner_k, inner_v in flatten(v, path):
                        yield inner_k, inner_v
                    path.pop()
                else:
                    transformed = self.transform_element(k, v)
                    for new_k, new_v in transformed:
                        if top_level:
                            yield new_k, new_v
                        else:
                            yield "%s.%s" % (path_string, new_k), new_v
        return dict(flatten(document, []))

在派生类中,我只想更改transform_element函数的一部分:

def transform_element(self, key, value):
    if key=="cats":
        yield key, self.transform_value(value)
    else:
        yield super().transform_element(key,value)

如果键是“猫”,我想使用我的逻辑。否则,我希望基类实现工作。我应该打电话给收益还是应该给退货?

1 个答案:

答案 0 :(得分:2)

你应该遍历重写的方法并产生它的每一项,否则你将得到一个不是你需要的生成器的发生器。

所以你的方法应该是这样的:

def transform_element(self, key, value):
    if key=="cats":
        yield key, self.transform_value(value)
    else:
        for item in super().transform_element(key,value):
            yield item