在 datetime 中,为什么 `year` 是 属性,而 `weekday()` 是一个函数?

In datetime, why is `year` a property, but `weekday()` a function?

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

import datetime
d = datetime.date.today()

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

TIO

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

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

class datetime.date(year, month, day)

All arguments are required.

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

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

可能是因为 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

我想不出特别的原因。它是一个带有记录 API 的模块,它说 weekday() 是一种方法而不是 属性。人们可以争论它是否应该是其他方式,但是一旦模块被发布并且人们编写了依赖于这个接口的代码,它就不能再改变了。 (除了弃用模块并发布 datetime2,Python 大神们确实已经为一些被设计严重破坏的模块做了。

如果它真的让您感到厌烦,您可以 'fix' 它。在 Python3(简化 super)中:

class MyDate( datetime.date):
    @property
    def weekday(self):
        return super().weekday()

>>> d = MyDate.today()
>>> d
MyDate(2018, 11, 14)
>>> d.weekday
2

无缘无故。这是不一致的,并且违反了 some basic principles。不要过多解读它,它可能是一些即时的决定卡住了。