python の from と import

以前から直接の 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 メソッドはなくそれを呼び出そうとするとエラーになります。

この辺は、モジュールとオブジェクトメソッドの構造に関するわかりやすいページがあればいいのですが、私には探せませんでした。