python模塊引用梳理


文件組織結構:

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

謝謝!


免責聲明!

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



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