2016-02-09 36 views
1

我有一個友好的一個月I類享受返回一個醜陋的機器人友好的字符串:對象的字符串表示殼

In [3]: d = date(2010, 1, 31) 

In [4]: m = Month(d) 

In [5]: m 
Out[5]: <dfa.date_range.Month at 0x7fb4d5793cc0> 

我想m顯示類似1-31-2010。我嘗試使用unicodestr,就像在Django,沒有骰子:

class Month(object): 

    def __init__(self, dateobj): 
     self.dateobj = dateobj 

    # def __unicode__(self): 
    #  return self.dateobj 

    def __str__(self): 
     return self.dateobj 

    @property 
    def first_day(self): 
     return self.dateobj.replace(day = 1) 

    @property 
    def last_day(self): 
     _, days_in_month = monthrange(self.dateobj.year, self.dateobj.month) 
     return self.dateobj.replace(day = days_in_month) 

    def date_range(self): 
     return self.first_day, self.last_day 

對於d對象,它沒有實現統一,但是有串。 str和ipython返回不匹配。我會爲此打開一個單獨的問題。我怎樣才能讓我的python類顯示對用戶有用的東西? Terima kasih

回答

1

真正的問題是,無論是Python 3的外殼和IPython都打電話給你的對象reprstr。這裏有一個片段播放用看:

In [1]: class Car(object): 
    ...:  def __str__(self): 
    ...:   return 'car str' 
    ...:  def __repr__(self): 
    ...:   return 'car repr' 
    ...:  

In [2]: car = Car() 

In [3]: car 
Out[3]: car repr 

沒有__repr__定義,IPython中會沿着<__main__.Car at 0x7f05841b1350>只是輸出一些回落至__str__代替。

除非你例如明確地呼叫str(car)print(car),其中將使用__str__

所以,你應該在對象中定義一個__repr__

__str__現在有什麼用呢?

這並不是說__repr__取代在Python 3或任何__str__,但__str__僅僅返回對象的可讀reprentation,而__repr__是一個比較完整明確的表示(到這種地步,你甚至可以從重建對象__repr__輸出)

+0

ty輸出日期對象的詳細信息,那麼現在__str__的用途是什麼呢? – codyc4321

0

我相信你會本月STR改成這樣:

def __str__(self): 
    return self.dateobj.strftime("%m/%d/%y") 

所以將訪問日期OB JECT與格式輸出你想要 編輯:此外,由於已經發布,可以使再版方法,只是讓它指向海峽,所以你總是得到相同的格式

+0

嗨,我相信'__str__'在IPython中的一個類是不夠的,因爲沒有'__repr__',IPython只是打印一些像:'<__ main __。MyClass at 0x7f05841b1350>' – bakkal

0
def __str__(self): 
    return self.dateobj.strftime("%Y-%m-%d") 

儘管你已經可以通過d.strftime("%Y-%m-%d")

+0

我不這麼認爲,看到我的答案試試看。 – bakkal