#python #datetime
#python #datetime
Вопрос:
Я новичок в Python, и я хочу сделать простой проект, чтобы сказать, сколько времени осталось до Рождества. Сначала у меня возникла проблема с текущим временем:
import datetime
now = datetime.now()
print(now)`
и ошибка сказала module 'datetime' has no attribute 'now'
Чем я это исправил, выполнив from datetime import datetime
, но чем вычисление даты создало ошибку в коде:
from datetime import datetime
xmas = datetime.date(2020, 12, 25) - datetime.date.today()
now = datetime.now()
print(now)
И ошибка была: Exception has occurred: TypeError descriptor 'date' requires a 'datetime.datetime' object but received a 'int'
Пожалуйста, помогите мне.
Хорошего дня!
Ответ №1:
Импорт datetime
класса немного сбивает с толку, потому что он находится в модуле, который также вызывается datetime
. Когда вы это делаете from datetime import datetime
, вы импортируете класс datetime
в текущую область и можете просто сделать datetime.now()
. Если вы просто делаете import datetime
, вы импортируете модуль datetime
и, следовательно, класс datetime.datetime
, создавая now
метод datetime.datetime.now()
. Ясно, как грязь? 🙂
Что еще больше усугубляет путаницу, datetime
модуль имеет date
класс, а datetime
класс имеет date
метод. Вы смешиваете их в своем коде, вызывая date
метод datetime
класса, когда вы хотите создать date
объект. Поскольку вы это сделали from datetime import datetime
, вы вообще не импортировали datetime.date
класс.
В любом случае, вот как это исправить:
import datetime
xmas = datetime.date(2020, 12, 25) - datetime.date.today()
now = datetime.datetime.now()
print(now)
Обратите внимание, что в этом коде xmas
является datetime.timedelta
объектом и now
является datetime.datetime
объектом.
Вы также могли бы сделать:
from datetime import date, datetime
xmas = date(2020, 12, 25) - date.today()
now = datetime.now()
print(now)
Надеюсь, параллельное рассмотрение двух примеров поможет прояснить проблему модуля и класса. Все дело в разных уровнях косвенности — в первом примере import
оператор вводит весь модуль, и ваш код должен указать, какие классы извлекать из него. Во втором примере from ... import
оператор извлекает эти два класса из модуля как часть импорта, и поэтому код может обращаться к ним напрямую по этим именам. Поскольку все имена настолько похожи, вы не можете полагаться на имя, чтобы узнать, к какой вещи вы обращаетесь, если вы действительно не понимаете, что именно сделал оператор import.
Комментарии:
1. могу ли я попросить еще об одной вещи? Как рассчитать время до Рождества, как я сделал для даты. Потому что у меня с этим проблемы
2.
time_till_xmas = datetime(2020, 12, 25) - datetime.now()
Ответ №2:
Вы должны импортировать его следующим образом:
from datetime import datetime