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

Python 在datetime中,为什么'year'是一个属性,而'weekday()'是一个函数?,python,python-3.x,python-datetime,Python,Python 3.x,Python Datetime,我对这段Python 3脚本有一个问题: import datetime d = datetime.date.today() print(d.year) print(d.weekday()) 为什么d.year没有括号,而d.weekday()没有?为什么一个是属性,另一个是函数?因为定义对象需要年,随后被设置为类的属性: 所有参数都是必需的 而weekday需要通过年、月和日的方法计算。因为工作日需要一些操作。可能是因为year是构造datetime.date对象时必需的参数。访问年份值

我对这段Python 3脚本有一个问题:

import datetime
d = datetime.date.today()

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


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

因为定义对象需要
,随后被设置为类的属性:

所有参数都是必需的


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

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

可能是因为
year
是构造
datetime.date
对象时必需的参数。访问
年份
值不需要在对象内进行计算。见实施:

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诸神确实为一些设计上严重破坏的模块做了这件事)

如果它真的有问题,你可以“修复”它。在Python3(简化的
super
)中:


毫无理由。这是不一致的,而且违反了法律。不要读太多,可能是某个即时决定卡住了。

年、月和日是类datetime属性的基本组成部分。获取工作日是涉及年、月和日的计算结果,因此它是一种方法。
def weekday(self):
    "Return day of the week, where Monday == 0 ... Sunday == 6."
    return (self.toordinal() + 6) % 7
class MyDate( datetime.date):
    @property
    def weekday(self):
        return super().weekday()

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