2017-04-11 34 views
0

我有下面的代碼庫:捕獲__repr__函數的輸出以可變

from datetime import datetime 

class Person: 
    def __init__(self,day,month,year): 
     self.day = day 
     self.mon = month 
     self.year = year 
    def __repr__(self): 
     if self.day < 10: 
      day = "0" + str(self.day) 
     else: 
      day = str(self.day) 
     if self.mon < 10: 
      mon = "0" + str(self.mon) 
     else: 
      mon = str(self.mon) 
     display = day + "-" + mon + "-" + str(self.year) 
     return display 

def sortdates(l1): 
    for dates in l1: 
     date.finalbirthdate = datetime.strptime(str(print(dates)),"%d-%m-%Y") 
     print (date.finalbirthdate) 

if __name__ == '__main__': 
    p1 = Person(18,9,1984) 
    print (p1) 
    p2 = Person(13,1,1988) 
    print (p2) 
    sortdates([p1,p2]) 

現在sortdates功能的主要功能是排序的Person對象按日期。爲此,我需要將Person對象的字符串表示轉換爲datetime對象。

此外,因爲我必須這樣做,我必須以某種方式捕獲字符串表示形式變量並將其傳遞給datetime.strptime函數。

有人可以請指導我如何做到這一點?

在此先感謝。

+0

你爲什麼不使用'__str__',而不是...?您可以使用repl()函數 – abccd

+0

'repr(日期)'會做到 - 刪除'str(print(...))' – AChampion

+0

不知道爲什麼'datetime'被更改爲'DateTime' ... python only有'datetime',你可以在標準庫中導入。 –

回答

1

正確的方法是爲您的Person對象定義__lt__,__gt__,__eq__方法;這樣你的Person對象就變成了「可排序」。現在

class Person: 
    def __init__(self,day,month,year): 
     self.day = day 
     self.mon = month 
     self.year = year 

    def _as_date(self): 
     return datetime.date(self.year, self.mon, self.day) 

    def __lt__(self, other): 
     return self._as_date() < other._as_date() 

    def __gt__(self, other): 
     return self._as_date() > other._as_date() 

    def __eq__(self, other): 
     return self._as_date() == other._as_date() 

    def __ne__(self, other): 
     return ! self.__eq__(other) 

    def __repr__(self): 
     return '{}-{}-{}'.format(str(self.day).zfill(2), 
           str(self.mon).zfill(2), 
           self.year) 

,你可以排序您的物品直接:

if __name__ == '__main__': 
    p1 = Person(18,9,1984) 
    print (p1) 
    p2 = Person(13,1,1988) 
    print (p2) 
    sorted_dates = sorted([p1,p2])