以前から直接の import やら、from からの import をよく理解せず何となく適当に使っていました。
今回やっと理解できたので書いておきます。
例えば以下のような python。
import datetime
print(datetime.datetime.now().hour)
これはちゃんと動きます。
そして以下のようにしても動きます。
from datetime import datetime
print(datetime.now().hour)
しかし、以下のようにするとエラーになります。
import datetime
print(datetime.now().hour)
なぜエラーが出るのか?
理解するためには以下のような構造を知る必要があります。
datetimeモジュール
+---datetimeオブジェクト
| +---year属性
| +---month属性
| +---...
| +---now()メソッド
| +---today()メソッド
| +---...
+---timedeltaオブジェクト
| +---...
+---timeオブジェクト
+---...
つまり datetime モジュールの中に datetime という同名のオブジェクトがあります。
import datetime
で import されたのは datetime モジュールであり、その直下に now() メソッドはありません。
なので、now() を呼び出すためには datetime.datetime.now() としなければなりません。
一方
from datetime import datetime
で import されるのは datetime モジュールの datetime オブジェクトなので、その中には datetime メソッドはなくそれを呼び出そうとするとエラーになります。
この辺は、モジュールとオブジェクトメソッドの構造に関するわかりやすいページがあればいいのですが、私には探せませんでした。