つまり、使用するには、次のようfoo
にすべてをインポートする必要があります。foo
from A.B.C import foo
またはせいぜい
from A.B import C
C.foo()
しかし、私はできません:
from A import B
B.C.foo()
のようなものが得られます'module' object has no attribute "C"
。
つまり、使用するには、次のようfoo
にすべてをインポートする必要があります。foo
from A.B.C import foo
またはせいぜい
from A.B import C
C.foo()
しかし、私はできません:
from A import B
B.C.foo()
のようなものが得られます'module' object has no attribute "C"
。
ドキュメントが理由を説明しています: http://docs.python.org/tutorial/modules.html
各モジュールには独自のプライベート シンボル テーブルがあり、モジュールで定義されたすべての関数によってグローバル シンボル テーブルとして使用されます。したがって、モジュールの作成者は、ユーザーのグローバル変数との偶発的な衝突を心配することなく、モジュールでグローバル変数を使用できます。一方、自分が何をしているのかわかっている場合は、その関数を参照するために使用されるのと同じ表記法 modname.itemname でモジュールのグローバル変数に触れることができます。
http://docs.python.org/tutorial/classes.html#python-scopes-and-namespaces :
厳密に言えば、モジュール内の名前への参照は属性参照です。式 modname.funcname では、modname はモジュール オブジェクトであり、funcname はその属性です。この場合、モジュールの属性とモジュールで定義されたグローバル名の間の単純なマッピングがたまたまあります: それらは同じ名前空間を共有しています!
したがって、単純に BC はインポートされず、最後の例では不明です。しかし、これはうまくいきます:
from A import B.C
B.C.foo()