【问题标题】:Why does this python method take self as a parameter为什么这个python方法以self为参数
【发布时间】:2015-09-30 07:18:06
【问题描述】:
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”方法以self为参数?肯定 pub_date 没有“自我”。可以正常工作

为清晰起见编辑标题

【问题讨论】:

标签: python django django-models


【解决方案1】:

没有。 pub_date 没有 self 会导致 NameError,因为它会引用一个不存在的局部或全局变量。

pub_date是模型实例的属性,只能通过self引用。

【讨论】:

    【解决方案2】:

    您的清单中没有类方法,只有普通方法。

    在任何一种情况下,python 方法(staticmethods 除外)都采用一个 self 参数来表示它们被调用的对象。或者更具体地说,第一个参数将传递给 self 对象,因此您不能拒绝定义 self 参数,只能给它一个不同的名称。

    更多关于类方法的细节在这里:When should I use @classmethod and when def method(self)?

    【讨论】:

      【解决方案3】:

      self 更改对象实例的属性。如果你想要一个类方法,这不能改变或访问特定变量的属性。如果 pub_date 没有改变,那么您可以将其设为类变量并在 was_published_recently 上方添加 @classmethod。然后,将self 更改为cls

      【讨论】:

      • 对不起,我没有意识到 classmethod 是它自己的东西,我的意思是类方法,就像这个类的方法一样。
      • 类方法基本上是一个普通的 Python 方法,只是在这种情况下你必须像 Question.method() 这样调用它
      【解决方案4】:

      如果没有Question 实例,即self,则不能调用方法was_published_recently()

      pub_date 是模型Question 的一个字段,并且没有任何模型实例,它不包含任何value,因为它只是一个变量。您将无法通过调用函数was_published_recently() 来获取值,因为它没有pub_date 的值来执行必要的计算。

      所以要调用was_published_recently() 方法,您必须将实例传递给该方法或使用. 运算符直接调用实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-09
        • 2022-06-15
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多