2012-07-31 11 views
6

bir paket yapısı mymodule.py olarak, ancakNeden modül erişim öznitelikleri __init__.py paketinde açıklanamıyor? <pre><code>mypackage __init__.py mymodule.py </code></pre> <p></p> I, örneğin <code>__init__.py</code> bazı "sabit" bildirimleri koymak aşağıdaki gibidir:

DELIMITER='\x01' 

kodu olamaz erişim DELIMITER ben eklemek sürece:

from __init__ import * 

m üstüne ymodule.py dosyası. Sanırım burada bir konsepti özledim. __init__.py'da bildirilen her şey, bir içe aktarma bildirimi aracılığıyla erişilinceye kadar belleğe okunmuyor mu? Ayrıca, bu __init__.py dosyasına koymak için tipik bir şey mi?

+4

"import" ifadesi olmadan çalışacağı izlenimi nereden aldınız? –

+0

@DavidRobinson: Python belgelerinden. ["__init__.py Ses paketini başlat" (http://docs.python.org/tutorial/modules.html#packages). __init__.py dosyasındaki kodun Python tarafından başlatıldığını varsaymaktan başka, orada ne dediklerini başka nasıl yorumlayacağımı bilmiyorum. –

cevap

5

Python paket bazı başlatma yapılması gereken izin veren içe aktarıldığında __init__.py kod çalıştırmak yapar. Ancak, sadece çalıştırıldığı için, diğer modüller içinden gelen değişkenlere erişiminiz olduğu anlamına gelmez.

Örneğin

:

testpackage 
    __init__.py 
    testmod.py 

en __init__.py kodunu print "Initializing __init__" olduğunu varsayalım ve testmod.py print "Initializing testmod" sahiptir. Bu durumda, testpackage veya testmod başlatma kodu çalıştırmasına neden olur ithal:

dynamic-oit-vapornet-c-499:test dgrtwo$ python -c "import testpackage" 
Initializing __init__ 
dynamic-oit-vapornet-c-499:test dgrtwo$ python -c "from testpackage import testmod" 
Initializing __init__ 
Initializing testmod 

O Ancak __init__.py gelen değişkenlere testmod.py erişim sağlamaz gelmez. Bunun açık bir şekilde yapılması gerekiyor.

+1

Teşekkürler. Şimdi anladım. Büyünün ne olduğunu ve bir kere denemeden önce ne olduğunu asla bilemezsiniz. :) –

2

Paketler, bir şekilde bunların içindeki tüm modülleri bir araya getirmiyor. __init__ ürününde, içe aktarmadığınız sürece diğer modüllerde erişilebilir olması için bir neden yoktur.