控制自定义类的排序/索引方式?

时间:2016-02-23 09:42:55

标签: python class sorting dictionary attributes

我试图以基于类的格式表示日历。

目前,数据以下列形式的OrderedDict表示:

from collections import OrderedDict

dictionary = OrderedDict()
dictionary[date] = {'attr1': ... ,
                    'attr2': ... ,
                    ... }

我希望实例化某种EnhancedDay类来表示字典中的数据,并使用相应的EnhancedCalendar类来保存{{1}的已排序容器(列表,OrderedDict?) }}秒。我正在看的功能:

  1. 要存储的多个EnhancedDay个对象 已排序 ,如EnhancedDay
  2. 按日期检索/使用EnhancedCalendar.attr的功能(即我希望将日期用作某种键'因此我可以通过某些内容检索EnhancedDay类似于EnhancedDay
  3. 一种附加/修改EnhancedCalendar.attr[date]个实例的属性的方法,这些属性存储为EnhancedDay实例的一部分,以便在我尝试 添加时< / strong> EnhancedCalendarEnhancedDay,其中EnhancedCalendar.attrEnhancedDay对象代表该日期,EnhancedCalendar.attr对象将被合并,而#34 ;自动&#34;
  4. 我认为#1,我基本上理解答案:

    1. 我会使用EnhancedDay装饰器(https://docs.python.org/2/library/functools.html#functools.total_ordering),指定@total_ordering和其他比较运算符以使用__eq__&#39; s EnhancedDay attr,并且很好。
    2. 不知道。在这个主题上有一些关于SO的帖子,但我找不到满足我需求的帖子。
    3. 我知道的最好方法是编写自定义合并函数(类似于custom_append)。 date发生合并或EnhancedCalendar.attr[date].custom_append(EnhancedDay)不存在,创建attr[date]再次,不确定最佳/最顺畅方式。我喜欢使用attr[date]
    4. 另外:在+=实例中存储EnhancedDay个实例的最佳数据类型是什么?

      或者,考虑到我想要完成的事情,我的一些想法可能只是......关闭。在这方面的任何帮助将不胜感激。

      或者,这一切都可能比它的价值更麻烦,在这种情况下,我仍然对如何使用类理论上完成这些事情感兴趣。

1 个答案:

答案 0 :(得分:1)

对于#2有几种方法可以做到这一点。一种方法可能是将日期转换为某种规范格式,然后将其用作字典中的字符串索引。

对于#3,请查看https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence

它确保您实现索引和+=运算符所需的功能,以便按您希望的方式工作。特别是要+=工作,您需要覆盖__iadd__()函数。 要Calendar[date]执行您想要的操作,您需要覆盖__getitem__()__setitem__()函数 - 但是collections.DefaultDict几乎可以完成您想要的操作,因此我可能会想要基于EnhancedCalendar的基础。

我想我会使用list数据类型来存储日历中的日期,然后你会按第1天进行索引。