Python - 基于特定访问类型覆盖方法

时间:2018-02-08 17:24:53

标签: python list ordereddictionary

我有一种情况需要创建一个字典来跟踪值的全局顺序。我还没有找到一个很好的方法让班级本身有一个递增的计数器,也可以跟踪价值。

这是我在此期间所写的内容,以解决这个问题:

from collections import defaultdict

class NotMyDict(object):
    """ defaultdict(list) that tracks order globally across the dict.

    Will function as a normal defaultdict(list) unless you modify the
    'ordered' attribute and set it to a non-false evaluating value.  This


    """
    ordered = False
    _data = defaultdict(NotMyDictList)
    _next_index = 0

    class NotMyDictList(list):
        def append(self, value):


    def __repr__(self):
        if self.ordered:
            return repr(self._data)
        else:
            temp = defaultdict(list)
            for key in self._data:
                for value in self._data[key]:
                    temp[key].append(value[0])
            return repr(temp)

    def __getitem__(self, key):
        if self.ordered:
            return self._data[key]
        else:
            return [val[0] for val in self._data[key]]

    def add_value_to_key(self, key, value):
        self._data[key].append((value, self._next_index))
        self._next_index += 1

所以我可以像普通字典一样使用它来提取值。如果密钥不存在,我可以实例化一个列表,但defaultdict简单易行。

以下是使用示例:

test = NotMyDict()

test.add_value_to_key('test', 'hi')
test.add_value_to_key('test', 'there')
test.add_value_to_key('test', 'buddy')

test['test']
Result:
['hi', 'there', 'buddy']
test.ordered = True
test['test']
Result:
[('hi', 0), ('there', 1), ('buddy', 2)]

现在 - 使用的例子并不是非常重要,但我似乎无法弄清楚的功能,而不是使用.add_value_to_key(),我希望能够使用普通的defaultdict(list)约定:

dict[key].append()

并且仍然跟踪索引。我是否需要传递带有id()的全局对象位置并在内存级别引用这些对象,或者我是否有一种方法可以让我不了解全局"类全局"它的成员可以访问它吗?

我也曾尝试使用嵌套类,但嵌套类无法访问父类的全局变量,所以我必须:

  1. 创建一个类似列表的类,以某种方式引用父类属性(可能带有id()和直接内存位置引用?)
  2. 修改/制作它的append()函数,以便它还更新父类全局计数器,并使用此计数器作为元数据字段跟踪该值。
  3. 我真的无法理解如何以一种让我使用defaultdict(list)的相同功能来创建这个对象/类的方式,我可以在其中索引/追加直接并让它跟踪该新值的全局索引顺序。

    dict[key].append(value)
    

    帮助将不胜感激 - 我在尝试使用不同的解决方案三个小时后才取消它并使用"只需使用此方法追加"现在。

0 个答案:

没有答案