2010-11-26 76 views
0

我試圖創建一個簡單的多級封裝:NameError定義蟒蛇多級封裝

test_levels.py 
level1/ 
     __init__.py (empty file) 
     level2/ 
       __init__.py (only contents: __all__ = ["leaf"]) 
       leaf.py 

leaf.py:

class Leaf(object): 
    print("read Leaf class") 
    pass 

if __name__ == "__main__": 
    x = Leaf() 
    print("done") 

test_levels.py:

from level1.level2 import * 
x = Leaf() 

運行leaf.py直接正常工作,但運行test_levels.py返回下面的輸出, 其中我是exp沒有輸出:

read Leaf class 
Traceback (most recent call last): 
    File "C:\Dev\intranet\test_levels.py", line 2, in <module> 
    x = Leaf() 
NameError: name 'Leaf' is not defined 

有人能指出我做錯了什麼嗎?

回答

0

嘗試添加

from leaf import * 

文件1級/級別2/__ init__.py

UPD:在以前的評論,之前模塊名稱添加點,並刪除 「__all__」 的宣言。

$ cat level1/level2/__init__.py 
from .leaf import Leaf 
$ cat level1/level2/leaf.py 
class Leaf: 
    def __init__(self): 
     print("hello") 
$ cat test.py 
from level1.level2 import * 
x = Leaf() 
$ python test.py 
hello 
+0

我想`從.leaf`只會工作在Python 3中(或者如果你在Python 2中從`__future__`導入absolute_imports)。 – 2010-11-26 16:51:47

+0

是的,但我認爲topicstarter完全使用python3,因爲他寫了print(...)而不是print ... – werehuman 2010-11-26 16:59:14

0

level1/level2/__init__.py,我覺得你想要做from leaf import *(或者,在Py3k,from .leaf import *)。

當您從level1.level2導入時,您確實在該目錄中導入__init__.py文件。由於您尚未在其中定義Leaf,因此您不會通過導入它來獲取它。

0

您是否期望從該包中的所有模塊導入所有變量名?這是一個可怕的想法。要做到你想要什麼,應該是

from level1.level2.leaf import * 

,甚至更好,但去除通配符進口,這通常是不好的,它應該是

from level1.level2.leaf import Leaf