天天看點

models __str__(self)和__unicode__(self)Python __str__(self)和__unicode__(self)

Python __str__(self)和__unicode__(self)

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

python3中使用

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對象。

python2中使用

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__。盡管這不是必須的,但還是建議這麼做。例如:

models __str__(self)和__unicode__(self)Python __str__(self)和__unicode__(self)
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__

models __str__(self)和__unicode__(self)Python __str__(self)和__unicode__(self)

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

models __str__(self)和__unicode__(self)Python __str__(self)和__unicode__(self)
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)
           
models __str__(self)和__unicode__(self)Python __str__(self)和__unicode__(self)

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

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

在Flask裡,定義一個Article類的資料模型相應的寫法可以寫成:

models __str__(self)和__unicode__(self)Python __str__(self)和__unicode__(self)
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
    }
           

轉載:https://www.cnblogs.com/urwlcm/p/4316536.html