经过C++
和C
编程多年之后,我实际上才刚接触Python编程,并且正努力去感受语法。
在下面的入门代码中:
from datetime import datetime
from datetime import date
print( datetime.now() )
# print( now() ) # NameError: name 'now' is not defined
print( date(2005, 2, 27) )
# print( datetime.date(2005, 2, 27) ) # TypeError: descriptor 'date' requires a 'datetime.datetime' object but received a 'int'
... 为什么必须在now()
中对datetime
进行范围划分,但显然date(...)
的范围是不正确的?
我所引用的学习材料说这两个import statements
表示我正在“ 从datetime标准模块导入日期和datetime类。”可能与我的{{1 }}背景下,我将C++
等同于module
,并认为这意味着(1)您需要使用它们来自的模块显式地作用于函数和类(例如{{1} })或(2)不需要显式作用域,因为namespace
子句类似于std::sort()
的{{1}}子句。所以上面的语法对我来说很奇怪,因为它看起来我正在使用来自日期时间“名称空间”的两个“事物”,因此我必须限定一件事,而不是另一个事物。。 / p>
FWIW,我使用from/import
作为编辑器-我想知道:使用启用了图形/自动建议功能的编辑器,关于此的某些事情会更加透明吗?
对于任何回答者,如果您能解释一位经验丰富的Python程序员将如何找到此类问题的答案,我将不胜感激。我的意思是:在CC++
/ using
中,我会查找vim
中的任何C
来查找内容-您如何“查找”日期时间“模块”?
答案 0 :(得分:4)
您是正确的-您无需进行范围调整!这种情况有点令人困惑,因为datetime
模块具有一个也称为datetime
的类。
那么每个这些都发生了什么:
print(datetime.now())
#调用now()
类的datetime
类方法并打印其输出
print(now())
#now()未在名称空间中定义,因此错误
print(date(2005, 2, 27))
#实例化date
对象并打印其表示形式
print(datetime.date(2005, 2, 27))
#这正在尝试调用date()
类的datetime
方法,该方法不存在,因此出错。
在最后一种情况下,如果您刚刚完成import datetime
,则整个datetime
模块都将被导入。在这种情况下,您可以通过执行datetime.date(2005,2,27)来实例化date
类对象。
希望有点道理!
答案 1 :(得分:0)
在python中的导入很简单。导入时
from datetime import datetime
那么您从modul datetime中获取的仅会导入类/函数datetime。 (在这种情况下为一堂课)。您的解释器不知道函数“现在”,但是当您对导入的内容进行循环时,您可以访问它。
datetime.now()
第二次导入后
from datetime import date
您的编译器知道类date和datetime。尝试
print( datetime.date(2005, 2, 27) )
那不是您所期望的。您尝试从类datetime调用函数date,该函数date具有其他参数作为来自modul datetime的类日期。 模块化datetime的问题在于它包含一个带有datetime的类,因此有点令人困惑。