Python 在datetime中,为什么'year'是一个属性,而'weekday()'是一个函数?
我对这段Python 3脚本有一个问题: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对象时必需的参数。访问年份值
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