簡體   English   中英

控制自定義類的排序/索引方式?

[英]Controlling how a custom class is sorted / indexed?

我試圖以基於類的格式表示日歷。

當前,數據以以下形式的OrderedDict表示:

from collections import OrderedDict

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

我非常喜歡實例某種EnhancedDay類代表在字典中的數據,並有相應的EnhancedCalendar的保存排序容器類(列表,OrderedDict?) EnhancedDay秒。 我正在查看的功能:

  1. 要存儲的一些EnhancedDay對象, 排序EnhancedCalendar.attr
  2. 能夠按日期檢索/使用EnhancedDay的功能(即,我想將日期用作一種“鍵”,以便我可以通過類似於EnhancedCalendar.attr[date]來檢索EnhancedDay
  3. 一種方法來附加/修改的屬性EnhancedDay被存儲為一個的一部分實例EnhancedCalendar實例,以便如果我嘗試將添加 EnhancedDayEnhancedCalendar.attr那里已經是一個EnhancedDay對象在EnhancedCalendar.attr表示日期, EnhancedDay對象將改為“自動”合並。

我認為對於#1,我基本上理解答案:

  1. 我將使用@total_ordering裝飾器( https://docs.python.org/2/library/functools.html#functools.total_ordering ),指定__eq__和其他比較運算符以使用EnhancedDaydate attr,並且會很好去。
  2. 不知道。 關於此主題,有幾篇關於SO的文章,但我還沒有找到滿足我需求的文章。
  3. 我知道的最好方法是編寫一個自定義合並功能(類似於custom_append)。 EnhancedCalendar.attr[date].custom_append(EnhancedDay)並進行合並,或者如果attr[date]不存在,則創建attr[date]再次,不確定執行此操作的最佳/最順暢方法。 我很樂意使用+=

另外:什么是存儲的最佳數據類型EnhancedDay實例中,在EnhancedCalendar實例?

另外,考慮到我要完成的工作,我的某些想法可能會...落空。 在這方面的任何幫助將不勝感激。

另外,這一切都可能比它值得的麻煩多,在這種情況下,我仍然對您如何使用類從理論上完成這些事情感興趣。

對於#2,有幾種方法可以執行此操作。 一種方法可能是將日期轉換為某種規范格式,然后將其用作字典的字符串索引。

對於#3,請查看https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence

它確保您實現索引和+=運算符以所需方式工作所需的功能。 專門為+=起作用,您需要重寫__iadd__()函數。 為了讓Calendar[date]做您想做的事情,您需要重寫__getitem__()__setitem__()函數-但是collections.DefaultDict幾乎__setitem__()您的要求,因此我可能會想以此為基礎來增強EnhancedCalendar。

我想我將使用列表數據類型在日歷中存儲日期,然后按第1天編制索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM