文件組織結構:
t ├── __init__.py ├── main.py ├── t1 │ ├── A.py │ └── __init__.py └── t2 ├── B.py └── __init__.py
A.py
def test(): print 't.t1.A.test()'
B.py
def test(): print 't.t2.B.test()'
執行:
python t/main.py
問題1:
在main.py中引用t2/B的test方法,如何寫?
方式1: from xxx import xxx
from t2 import B B.test()
這個寫法很糟糕, 但能解決目前問題。糟糕的地方在於隱晦的引入t2。更好的方式是相對引用。
from .t2 import B B.test()
但如果用 python t/main.py執行會報錯,此處原因請參考這。原因是相對引用默認作為包的方式才能運行。
正確執行方法(linux shell下): python -m t.main
這個寫法也不夠好!B在具體的代碼行,看不出其出處。更好的方式是
from . import t2 t2.B.test()
但運行時會報錯!
AttributeError: 'module' object has no attribute 'B'
大致意思是, 模塊對象沒有B屬性!這點從java/.net轉過來的也許有一點不習慣!
pythony引入一個模塊(import m) <==> 引入m/__init__.py文件,里面有啥就有啥,反之亦然。
破解方法:
1. 不太好的方法有上一個代碼例子, 即: from ... import ...
2. 在模塊的__init__.py文件中自動引入這些文件, 推薦最為最佳實踐!
此處修改 t/t2/__init__.py文件
import B
這樣問題就完美結果了。總結下,最佳實踐demo如下:
t/main.py
# -*- coding:utf-8 -*- from . import t2 t2.B.test()
t/t2/__init__.py
# -*- coding:utf-8 -*- from . import B
即:
1. 相對引用
2. 盡量引入更頂層包
3. 通過命名空間引用具體的方法或者類
4. 被引用包(子包)需要在__init__.py中聲明(import)可以被外部直接訪問的文件
問題2:
在t2/B中如何引用t1/A的test方法?
t/t2/B.py
from .. import t1 t1.A.test()
同時聲明A
t/t1/__init__.py
from . import A
轉載請注明本文來源:http://www.cnblogs.com/Tommy-Yu/p/5794829.html
謝謝!