2015-07-11 46 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(),您必须将实例传递给此方法,或者使用.运算符直接调用实例。

相关问题