Article View: pl.comp.lang.python
Article #27049Re: Python i importowanie
From: marmarprog
Date: Sun, 20 Dec 2009 22:02
Date: Sun, 20 Dec 2009 22:02
97 lines
4139 bytes
4139 bytes
On 20 Gru, 22:10, Michal M <mmier...@tycowaterworks.pl> wrote:
> Ok, ten sam problem się powtórzył. Tym razem podam dokładnie przykład.
>
> module1.py
> log = None
>
> module2.py
> class Log(object):
> def __init__(self):
> pass
> def m(self):
> print "ok"
>
> module3.py
> import module1
> import module2
> import module4
>
> module1.log = module2.Log()
> t = module4.Test()
> t.use_m()
>
> module4.py
> from module1 import log
>
> class Test(object):
> def __init__(self):
> pass
> def use_m(self):
> log.m()
>
> Uruchamiam moduł 3. Ja to widzę tak:
> 1. importuje moduły 1, 2 i 3 (czyli udostępnia ich przestrzeń poprzez
> nazwę modułu w module 3)
> 2. pod zmienną log w module 1 podstawia instancję klasy Log z modułu 2
> 3. Pod zmienną t podstawia instancję klasy Test z modułu 4 i próbuje
> wykonać jej metodę use_m()
> W tym miejscu otrzymuję błąd: AttributeError: 'NoneType' object has no
> attribute 'm'
>
> Teraz powiedzmy, że moduł 4 zmienię tak:
>
> module4.py
> import module1
>
> class Test(object):
> def __init__(self):
> pass
> def use_m(self):
> module1.log.m()
>
> Czyli wg mnie powinno być to samo, tyle że zamiast bezpośrednio do log
> mam dostęp poprzez module1.log.
> Zastanawiałem się, czy może samo log.m() nie widzi jako zmiennej
> lokalnej i nie potrzeba dodać global log ale też nie pomaga.
> Proszę o wyjaśnienie.
>
> Pozdrawiam
> Michał
Python tak działa.
Zmienne można powiedzieć są etykietowane przez nazwę. Oznacza to że
jeżeli użyjemy instrukcji przypisania to przypiszemy danej etykiecie
nowy obiekt np.
log=None # obiekt None otrzymuje etykietę log
b=log # obiekt None otrzymuje nowa etykietę b
# teraz jeśli napiszę
log=3 # obiekt 3 otrzymuje etykietę log ale etykieta b nadal odnosi
sie do obiektu None (tak samo )
Pisząc
module1.log= ...
modyfikujesz tylko etykiete w przestrzeni nazw modułu modul1. tylko
importy wykonane po tej instrukcji będą widzieć ta zmianę.
Ale dosyć tych bredni.
Jeżeli chcesz zamiast module1.log.m() pisać log.m() zrezygnuj z
module2 i napisz w module1
class Log(object):
def __init__(self):
pass
def m(self):
print "ok"
log = None
potem piszesz w dowolmym module
from module1 import log
oczywiście jeśli napiszesz potem "gdzieś" module1.log=... to znów
"gdzieś" odnosić się bedziesz do innego obiektu.
i możesz z obiektu log pakować i doczytywać cokolwiek:
log.xxx=3
a winnym module
print log.xxx
Technical Details
Message-ID:
<219429b1-25a3-43a5-b074-16a97e723772@p8g2000yqb.googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!wsisiz.edu.pl!plix.pl!newsfeed1.plix.pl!news-out2.kabelfoon.nl!newsfeed.kabelfoon.nl!xindi.nntp.kabelfoon.nl!xlned.com!feeder3.xlned.com!feeder.news-service.com!postnews.google.com!p8g2000yqb.googlegroups.com!not-for-mailReferences:
<37d6d97e-88b4-4324-9973-a368959f8339@e27g2000yqd.googlegroups.com> <52950de7-b700-40e0-964d-0bb7ab394964@x15g2000vbr.googlegroups.com> <mburv6-lmm.ln1@bozon.softax.pl> <30287087-8528-4210-9ba0-0f4c7784279a@h9g2000yqa.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!wsisiz.edu.pl!plix.pl!newsfeed1.plix.pl!news-out2.kabelfoon.nl!newsfeed.kabelfoon.nl!xindi.nntp.kabelfoon.nl!xlned.com!feeder3.xlned.com!feeder.news-service.com!postnews.google.com!p8g2000yqb.googlegroups.com!not-for-mail From: marmarprog <marmarprog@gmail.com> Newsgroups: pl.comp.lang.python Subject: Re: Python i importowanie Date: Sun, 20 Dec 2009 14:02:33 -0800 (PST) Organization: http://groups.google.com Lines: 104 Message-ID: <219429b1-25a3-43a5-b074-16a97e723772@p8g2000yqb.googlegroups.com> References: <37d6d97e-88b4-4324-9973-a368959f8339@e27g2000yqd.googlegroups.com> <52950de7-b700-40e0-964d-0bb7ab394964@x15g2000vbr.googlegroups.com> <mburv6-lmm.ln1@bozon.softax.pl> <30287087-8528-4210-9ba0-0f4c7784279a@h9g2000yqa.googlegroups.com> NNTP-Posting-Host: 87.119.53.157 Mime-Version: 1.0 X-Trace: posting.google.com 1261346553 12433 127.0.0.1 (20 Dec 2009 22:02:33 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Sun, 20 Dec 2009 22:02:33 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: p8g2000yqb.googlegroups.com; posting-host=87.119.53.157; posting-account=_WXOnAoAAADpIYmQldLJjq0CQ4YXMCuB User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.1.5) Gecko/20091109 Linux Mint/7 (Gloria) Shiretoko/3.5.5 GTB6 GTBA,gzip(gfe),gzip(gfe) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit