読者です 読者をやめる 読者になる 読者になる

<Python> import

importって、ある特定ディレクトリの下のファイルを読み込んでいるかと思ってた。
そうじゃなくて(そうじゃないよー byミトメン) オブジェクトを読み込んでるっぽい。

ディレクトリaaaにファイル__init__.pyがあった場合。

[0:hage:~]>ls
aaa/
[1:hage:~]>cd aaa/
__init__.py   __pycache__/
[2:hage:~]>vim __init__.py

で、__init__.pyの中身は、

import pandas as pd

df = pd.DataFrame(data=[1, 2, 3])


class bbb():
    def __init__(self):
        self.x = 0
        self.y = 0

    def __all__(self):
        return [self.x, self.y]

B = bbb()

これで、aaaの上のディレクトリから、ipythonすると、、

In [1]: from aaa import df

In [2]: from aaa import B

In [4]: whos
Variable   Type         Data/Info
---------------------------------
B          bbb          <aaa.bbb object at 0x00000000049D40F0>
df         DataFrame       0\n0  1\n1  2\n2  3

In [6]: B.x
Out[6]: 0

In [7]: df
Out[7]: 
   0
0  1
1  2
2  3

なるほど、、、
___init__.py内のオブジェクトが呼ばれてる。
なら、aaaを呼んだ場合は、

In [8]: import aaa

In [9]: whos
Variable   Type         Data/Info
---------------------------------
B          bbb          <aaa.bbb object at 0x00000000049D40F0>
aaa        module       <module 'aaa' from 'C:\\m<...>_play\\aaa\\__init__.py'>
df         DataFrame       0\n0  1\n1  2\n2  3

In [10]: aaa.df
Out[10]: 
   0
0  1
1  2
2  3

なる、、かなりわかったなり。

なら、__init__.pyを名前変えて、bbb.pyとしたら、、、

[3:hage:~]>mv __init__.py bbb.py
In [1]: import aaa

In [2]: whos
Variable   Type      Data/Info
------------------------------
aaa        module    <module 'aaa' (namespace)>

In [3]: dir(aaa)
Out[3]: ['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

なんだか空っぽい。
なら、、、

In [4]: import aaa.bbb

In [5]: whos
Variable   Type      Data/Info
------------------------------
aaa        module    <module 'aaa' (namespace)>

In [6]: dir(aaa.bbb)
Out[6]: 
['B',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 'bbb',
 'df',
 'pd']

In [7]: aaa.bbb.B
Out[7]: <aaa.bbb.bbb at 0x4716e10>

In [8]: aaa.bbb.B.x
Out[8]: 0

呼び出せた。
なるほど。。。

ちとわかった気がする。

マニュアル

6. モジュール (module) — Python 3.5.1 ドキュメント