AttributeError: модуль datetime не имеет атрибута now - PullRequest
0 голосов
/ 01 июня 2018

Я изучаю Python самостоятельно.Теперь я столкнулся с некоторыми проблемами.Ниже мой код, который скопирован из видео, которое работает хорошо.

import datetime

print(type(datetime))
d1 = datetime.datetime.now()
print(d1)

, когда я запускаю код с помощью Pycharm & sublime, я получил ошибку.Ниже приведена информация об ошибке sublime

<class 'module'>
Traceback (most recent call last):

  File "D:\programming\python\datetime.py", line 1, in <module>
    import datetime

  File "D:\programming\python\datetime.py", line 4, in <module>
    d1 = datetime.datetime.now()

AttributeError: module 'datetime' has no attribute 'now'

. Ниже приведена информация об ошибке pycharm

D:\programming\python\venv\Scripts\python.exe C:\Program Files\JetBrains\PyCharm 2018.1.2\helpers\pydev\pydevconsole.py" 63029 63030
<class 'module'>
Traceback (most recent call last):

  File "C:\Program Files\JetBrains\PyCharm 2018.1.2\helpers\pydev\pydevconsole.py", line 4, in <module>
    from _pydev_imps._pydev_saved_modules import thread

  File "C:\Program Files\JetBrains\PyCharm 2018.1.2\helpers\pydev\_pydev_imps\_pydev_saved_modules.py", line 21, in <module>
    import xmlrpc.client as xmlrpclib

  File "D:\programming\Anoconda3\lib\xmlrpc\client.py", line 134, in <module>
    from datetime import datetime

  File "D:\programming\python\datetime.py", line 4, in <module>
    d1 = datetime.datetime.now()

AttributeError: module 'datetime' has no attribute 'now'
Process finished with exit code 1

. Этот код хорошо работает под IDLE и cmd.И он работает хорошо, когда я просто кодирую print(type(datetime)), но печатаю дважды тип даты и времени.

Я не знаю, как это сделать, пожалуйста, дайте мне несколько советов.Спасибо.

1 Ответ

0 голосов
/ 03 июня 2018

РЕДАКТИРОВАТЬ **: пользовательский собственный модуль datetime.py переопределял стандартную библиотеку, информация, представленная ниже, все еще полезна, чтобы понять, почему это произойдет.Алгоритм импорта сначала проверяет ваш непосредственный каталог.Вы можете проверить путь к файлу этих модулей с помощью:

print a_module.__file__

Добро пожаловать в дикий мир программирования.Поэтому я не уверен, что полностью понимаю ваш вопрос, поэтому постараюсь разобрать некоторые вещи и оставить место для обсуждения.

Когда вы импортируете datetime, вы импортируете то, что называется module ,Не вдаваясь в подробности, модули являются так называемыми пространствами имен, они служат для создания разделения атрибутов в иерархии, поэтому вы случайно не перезаписываете другой код при импорте.Вы можете прочитать подробнее об этом здесь:

https://docs.python.org/3/tutorial/modules.html

Модуль datetime предоставляет классы для управления датами и временем как простыми, так и сложными способами.Хотя арифметика даты и времени поддерживается, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования и обработки выходных данных.Для получения информации о соответствующих функциях см. Также модули времени и календаря.

Когда вы импортируете его и запустите метод type для него, вы должны увидеть следующие результаты:

>>>import datetime
>>> type(datetime)
<class 'module'>

ВстроенныйДокументация метода типа гласит следующее:

4.12.6.Объекты типа Объекты типа представляют различные типы объектов.Доступ к типу объекта осуществляется с помощью встроенной функции type ().Там нет специальных операций над типами.Стандартные типы модулей определяют имена для всех стандартных встроенных типов.

, когда вы явно печатаете этот вывод, это будет тот же результат:

 >>> print(type(datetime))
<class 'module'>

Модули выставляют атрибуты при импорте.Атрибут, к которому вы обращаетесь, является атрибутом datetime модулей datetime, который является class , который просто имеет то же имя.Поэтому, когда вы обращаетесь к нему, он выглядит как datetime.datetime

. Этот класс поддерживает метод (который также является атрибутом класса, а не модуля) с именем "now".Итак, когда вы обращаетесь к этому методу, он выглядит как datetime.datetime.now () для его вызова.

Если вы хотите упростить эту иерархию при импорте, вы можете пояснить, что вам нужен только класс datetime из модуля datetime:

from datetime import datetime
#and the access its now method simpler
d1 = datetime.now()

Это может помочь с проблемами доступа к атрибутам, этоможет быть вопрос путаницы.Если вы хотите больше прояснить свою проблему, пожалуйста, не стесняйтесь!

Надеюсь, это поможет.

...