【问题标题】:In datetime, why is `year` a property, but `weekday()` a function?在 datetime 中,为什么 `year` 是一个属性,而 `weekday()` 是一个函数?
【发布时间】:2018-11-14 10:52:49
【问题描述】:

我对这段 Python 3 脚本有疑问:

import datetime
d = datetime.date.today()

print(d.year)
print(d.weekday())

TIO

为什么d.year 没有括号,而d.weekday() 不是?为什么一个是属性,另一个是函数?

【问题讨论】:

  • 年、月和日是类 datetime so 属性的基本组成部分。获取工作日是涉及年月日的计算结果,因此它是一种方法。

标签: python python-3.x python-datetime


【解决方案1】:

可能是因为year 是构造datetime.date 对象时的必需参数。对象内无需计算即可访问year 值。查看实现:

class date:
    def __new__(cls, year, month=None, day=None):
        ...

而需要计算工作日:

def weekday(self):
    "Return day of the week, where Monday == 0 ... Sunday == 6."
    return (self.toordinal() + 6) % 7

【讨论】:

    【解决方案2】:

    因为year 是定义datetime.date 对象所必需的,并且随后被设置为类的属性:

    class datetime.date(year, month, day)
    

    所有参数都是必需的。

    weekday 需要通过 from 年、月和日的方法计算。

    【讨论】:

      【解决方案3】:

      我想不出什么特别的原因。它是一个带有文档化 API 的模块,上面写着 weekday() 是一个方法而不是一个属性。人们可以争论是否应该如此,但是一旦模块发布并且人们编写了依赖于这个接口的代码,它就不能再改变了。 (除了弃用模块并发布datetime2 之外,Python 之神确实为一些在设计上被严重破坏的模块做了这些)。

      如果它真的让您感到困扰,您可以“修复”它。 Python3中(简体super):

      class MyDate( datetime.date):
          @property
          def weekday(self):
              return super().weekday()
      
      >>> d = MyDate.today()
      >>> d
      MyDate(2018, 11, 14)
      >>> d.weekday
      2
      

      【讨论】:

        【解决方案4】:

        没有充分的理由。这是不一致的,并且违反了some basic principles。不要过多解读它,这可能是一些即时决定卡住了。

        【讨论】:

          【解决方案5】:

          因为工作日需要一些操作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-12-09
            • 2014-09-14
            • 2023-03-17
            • 1970-01-01
            • 1970-01-01
            • 2020-09-29
            • 1970-01-01
            相关资源
            最近更新 更多