在 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())
为什么 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。不要过多解读它,它可能是一些即时的决定卡住了。
我对这段 Python 3 脚本有疑问:
import datetime
d = datetime.date.today()
print(d.year)
print(d.weekday())
为什么 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。不要过多解读它,它可能是一些即时的决定卡住了。