计算年龄的程序会给出getset_descriptor的错误吗?

时间:2016-12-31 14:54:38

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

我正在尝试编写一个非常简单的Python程序来计算某个人的年龄,我认为理论上它应该可以工作,但每次我尝试运行它时,都会抛出这个错误:

What year were you born in? 2005
Traceback (most recent call last):
  File "python", line 5, in <module>
TypeError: unsupported operand type(s) for -: 'getset_descriptor' and 'int'

我尝试将datetime.year(year)(相同的东西)转换为整数。虽然它们已经整数,但它并没有起作用。这是我的代码:

from datetime import datetime
year = datetime.year
born = input("What year were you born in?")
born = int(born)
end = year - born
print(end)

1 个答案:

答案 0 :(得分:4)

year = datetime.year没有给你当年。它会为您提供未绑定的descriptor object(错误中的getset_descriptor):

>>> datetime.year
<attribute 'year' of 'datetime.date' objects>
>>> type(datetime.year)
<class 'getset_descriptor'>
>>> datetime.year - 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'getset_descriptor' and 'int'

这里不要过多担心对象的确切类型,这只是使datetime这样的内置不可变类型的实例工作所需的实现细节。它只是意味着您没有datetime类型的实例,因此该实例也没有year值。

如果您想要当前年份,请使用datetime.now().year

year = datetime.now().year

datetime.now()为您提供datetime 实例,即代表当前时间和日期的实例。该实例具有有效的year属性。

您当然也可以使用datetime.date.today()

>>> from datetime import datetime, date
>>> datetime.now()
datetime.datetime(2016, 12, 31, 14, 58, 14, 994030)
>>> datetime.now().year
2016
>>> date.today().year
2016