[英]Controlling how a custom class is sorted / indexed?
我試圖以基於類的格式表示日歷。
當前,數據以以下形式的OrderedDict表示:
from collections import OrderedDict
dictionary = OrderedDict()
dictionary[date] = {'attr1': ... ,
'attr2': ... ,
... }
我非常喜歡實例某種EnhancedDay
類代表在字典中的數據,並有相應的EnhancedCalendar
的保存排序容器類(列表,OrderedDict?) EnhancedDay
秒。 我正在查看的功能:
EnhancedDay
對象, 排序為EnhancedCalendar.attr
EnhancedDay
的功能(即,我想將日期用作一種“鍵”,以便我可以通過類似於EnhancedCalendar.attr[date]
來檢索EnhancedDay
EnhancedDay
被存儲為一個的一部分實例EnhancedCalendar
實例,以便如果我嘗試將添加 EnhancedDay
到EnhancedCalendar.attr
那里已經是一個EnhancedDay
對象在EnhancedCalendar.attr
表示日期, EnhancedDay
對象將改為“自動”合並。 我認為對於#1,我基本上理解答案:
@total_ordering
裝飾器( https://docs.python.org/2/library/functools.html#functools.total_ordering ),指定__eq__
和其他比較運算符以使用EnhancedDay
的date
attr,並且會很好去。 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.