2

同じ名前空間に共存する場合に、モジュール レベルとクラス レベルのインポートがどのように処理されるかを明確にする必要があります。次の例を参照してください。

作品:

import datetime
print datetime.datetime.utcnow()

失敗:

from datetime import datetime
print datetime.datetime.utcnow()

エラー: AttributeError: タイプ オブジェクト 'datetime.datetime' には属性 'datetime' がありません

作品:

from datetime import datetime # Is this ignored?
import datetime
print datetime.datetime.utcnow()

3番目の例では正確に何が起こっていますか? 2 番目のモジュールのインポートは、クラス固有の最初のインポートに取って代わりますか? これは、モジュール レベルとクラス レベルのインポートを同じ名前空間に混在させてはならないということですか?

4

5 に答える 5

6

そのような優先順位はありません。結果は、次のimportように、ステートメントが実行される順序によって決定されます。

X名前空間に呼び出されたいくつかのものをインポートしようとすると、各インポートはインポート対象Xのものに再バインドされます。

したがって、名前に関する限り、最後に有効になるのは最後のインポートになりますX

これはまさにあなたの3番目の例で起こることです:

from datetime import datetime # This isn't ignored, but the name is immediately rebound
                              # by the next line
import datetime               # Rebinds the name
于 2012-12-06T16:43:15.440 に答える
2

Python をサポートする IDE のいくつかは説明を提供しますが、はい、3 番目の例でインポートを再定義 (上書き、置換) しています。ファイル内の各名前は個別です。名前を共有するモジュールとクラスにアクセスする必要がある場合は、from datetime import datetime as dt.

于 2012-12-06T16:43:29.647 に答える
1

インポートは実際には単なる割り当てです。現在の名前空間に名前を設定します。したがって、3番目のケースでは、名前datetimeをdatetimeクラスと同じに設定し、すぐにそれをdatetimeモジュールに再割り当てします。

于 2012-12-06T16:52:16.840 に答える
0

最初の例では、モジュールをインポートし、それを表すローカル名前空間にラベルdatetimeを提供してから、モジュールに属するオブジェクトのメソッドを呼び出します。2 番目は、オブジェクト (モジュールではない) をラベル付きのローカル名前空間に追加しますが、オブジェクトには属性がないため、例外が発生します。3 番目の例では、名前空間内のその名前のラベルにオブジェクトを割り当て、そのラベルをモジュールに再割り当てします。そのため、この質問とは無関係のメカニズムを無視すると(基本的に、モジュールがまだ存在しない場合はモジュールを追加します)、次のようになります。datetimeutcnow()datetimedatetimedatetime.datetimedatetimedatetimedatetimedatetime.datetimedatetimeimportsys.modules

datetime = sys.modules['datetime']
datetime.datetime.utcnow()

それから

datetime = sys.modules['datetime'].datetime
datetime.datetime.utcnow()

それから

datetime = sys.modules['datetime'].datetime
datetime = sys.modules['datetime']
datetime.datetime.utcnow()
于 2012-12-06T16:45:07.393 に答える
0

次のようにする理由はありません。

from datetime import datetime
print datetime.datetime.utcnow()

一方、このコードは、あなたが望むことを正確に実行します。

from datetime import datetime
print datetime.utcnow()
于 2012-12-06T16:46:20.323 に答える