python3 module中__init__.py的需要注意的地方


網上關於__init__.py的作用的資料到處都是,我在此就不再啰嗦哪些了。

若有需要、請各位看官去搜搜即可。

 

最近剛開始用Python3 就遇到了這個比較有意思的事情

閑言少敘,下面要介紹的是python3中__init__.py中的一些略微不同的地方

目錄結構如下:

├── mdl
│   ├── __init__.py
│   ├── bar.py
│   └── foo.py
└── test.py

 

文件內容,從上至下,依次為

mdl/__init__.py:

#encoding:utf-8

from .foo import Foo    #python2、3都適用
from .bar import Bar    #python2、3都適用
#from mdl.foo import Foo    #python2、3都適用
#from mdl.bar import Bar    #python2、3都適用
#from foo import Foo    #python3不適用
#from bar import Bar    #python3不適用

 


mdl/bar.py:

class Bar():
    def __init__(self):
        pass


mdl/foo.py

class Foo():
    def __init__(self):
        pass

 

test.py

from mdl.foo import Foo
from mdl.bar import Bar
f = Foo()
b = Bar()

 

大家看到的貼的代碼,可能就知道我所要說的是什么意思了吧……

對,沒錯。

之前在我們使用python2的時候(至少從python2.6之后是這樣),我們通常將__init__.py置空(PS:置空的話,與python3也可以通用)或者直接(如下圖所示)

from foo import Foo
from bar import Bar

然后可以正常地愉快地使用python test.py,沒有任何報錯信息。

 

但是在python3的時候(至少從python3.4之后是這樣),我們這么來做

from foo import Foo
from bar import Bar

運行python test.py發現出錯了,囧……

ImportError: No module named 'foo'

 

別的我也不多說了,我想大家也都看明白了

建議,大家之后都使用這種方式(通用用法)

from .foo import Foo
from .bar import Bar

 

【附錄】

1、在python2來運行程序(即python test.py)之后,發現

├── mdl
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── bar.py
│   ├── bar.pyc
│   ├── foo.py
│   └── foo.pyc
└── test.py

(對,我們很常見的.pyc出現了)

2、在python3來運行程序之后,發現

├── mdl
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-34.pyc
│   │   ├── bar.cpython-34.pyc
│   │   └── foo.cpython-34.pyc
│   ├── bar.py
│   └── foo.py
└── test.py

(看到了不同了吧……)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM