Python __str__(self)和__unicode__(self)


官方文檔:https://docs.python.org/2.7/reference/datamodel.html?highlight=__mro__

object. __str__ ( self )

Called by the str() built-in function and by the print statement to compute the “informal” string representation of an object. This differs from __repr__() in that it does not have to be a valid Python expression: a more convenient or concise representation may be used instead. The return value must be a string object.

【譯文】通過內嵌方法str()調用,並通過print語句計算對象的“非正式”字符串表示。這跟__repr__()的區別在於,它不需要是一個合法的Python表達式:可以用一種更便捷或簡明的表現方式。返回類型必須是一個string對象。

object. __unicode__ ( self )

Called to implement unicode() built-in; should return a Unicode object. When this method is not defined, string conversion is attempted, and the result of string conversion is converted to Unicode using the system default encoding.

【譯文】實現unicode()內嵌函數;應該返回Unicode對象。當沒有定義這個方法時,取而代之的是string轉換,轉換的結果是用系統默認編碼轉化為Unicode。

 

============以下內容翻譯自這里==============

__str__()是Python的一個“魔幻”方法,這個方法定義了當object調用str()時應該返回的值。Django在許多地方使用str(obj)(或者相關方法,unicode(obj)——見下文),比如說在Django管理站點加載一個對象時顯示它的值或者作為對象的顯示值插入模板中。因此,我們應該總是返回一個友好的,用戶可讀的字符串作為對象的__str__。盡管這不是必須的,但還是建議這么做。例如:

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def __str__(self):
        # Note use of django.utils.encoding.smart_str() here because
        # first_name and last_name will be unicode strings.
        return smart_str('%s %s' % (self.first_name, self.last_name)
__unicode__

__unicode__()方法是在一個對象上調用unicode()時被調用的。因為Django的數據庫后端會返回Unicode字符串給model屬性,所以我們通常會給自己的model寫一個__unicode__()方法。前面的例子也可以更簡單地寫成:

class Person(models.Model):  
     first_name = models.CharField(max_length=50)  
     last_name = models.CharField(max_length=50)  
  
     def __unicode__(self):  
         return u'%s %s' % (self.first_name, self.last_name)

如果定義了__unicode__()方法但是沒有定義__str__()方法,Django會自動提供一個__str__()方法調用__unicode__()方法,然后把結果轉換為UTF-8編碼的字符串對象。在實際開發中,建議:只定義__unicode__()方法,需要的話讓Django來處理字符串對象的轉換。

============翻譯結束==========================

在Flask里,定義一個Article類的數據模型相應的寫法可以寫成:

class Article(db.Document):
    Title = db.StringField(max_length=255, required=True)
    SegTitle = db.StringField(max_length=255)
    Url = db.StringField(max_length=255, required=True)
    Id = db.StringField(max_length=255, required=True)
    Summary = db.StringField(max_length=255)
    Content = db.StringField()
    SegContent = db.StringField()
    Tags = db.ListField(db.EmbeddedDocumentField(Tag))
    StrTags = db.ListField(db.StringField(max_length=30))
    LabeledTags = db.ListField(db.StringField(max_length=30))
    CrawledDate = db.DateTimeField()
    PostDate = db.StringField()
    Source = db.StringField()
    OriginalSource = db.StringField()

    @property
    def post_type(self):
        return self.__class__.__name__

    def __unicode__(self):
        return self.Title

    meta = {
        'allow_inheritance': False
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM