2015-07-11 68 views
1
class Question(models.Model): 
    question_text = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

    def was_published_recently(self): 
     return self.pub_date >= timezone.now() - datetime.timedelta(days=1) 

爲什麼「was_published_recently」方法將自己當作參數?當然pub_date沒有「自我」。就做工精細爲什麼這種python方法將自己當作參數

編輯的標題爲清楚起見

+0

也有一些很好的後續閱讀http://stackoverflow.com/questions/1984104/python-how-to-avoid-explicit-self –

回答

3

否則pub_date沒有自身會導致NameError,因爲它會引用一個不存在的局部變量或全局變量。

pub_date是模型實例的一個屬性,只能通過self來引用。

0

self改變一個對象實例的屬性。如果你想要一個類方法,這不能改變或訪問一個特定變量的屬性。如果pub_date不更改,則可以將其設置爲類變量,並在was_published_recently之上添加@classmethod。然後,將self更改爲cls

+0

對不起,我沒有意識到classmethod是它自己的東西,我的意思是class方法在這個類的方法中。 – Mascros

+0

類方法基本上是一種普通的Python方法,除了在這種情況下必須將它稱爲'Question.method()' – ytpillai

1

您的列表中沒有類方法,只有普通的方法。

在任何一種情況下,python方法(除staticmethod之外)都有一個自我參數,代表它們被調用的對象。或者更具體地說,第一個參數將傳遞自我對象,所以你不能拒絕定義一個自我參數,只給它一個不同的名字。在這裏classmethods

更多細節:When should I use @classmethod and when def method(self)?

0

您不能調用方法was_published_recently()沒有Question實例即self

pub_date是模型Question的一個字段,沒有任何模型實例,它不包含任何value,因爲它只是一個變量。通過調用函數was_published_recently()將無法​​獲得值,因爲它不具有用於執行必要計算的pub_date的值。

因此要調用方法was_published_recently(),您必須將實例傳遞給此方法,或者使用.運算符直接調用實例。

相關問題