🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #27070

Re: Python i importowanie

#27070
From: Michal M
Date: Sun, 20 Dec 2009 22:40
120 lines
5304 bytes
On 20 Gru, 23:02, marmarprog <marmarp...@gmail.com> wrote:
> 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

Dzięki za odpowiedź. To nie brednie to pomaga mi zrozumieć to
zachowanie (choć jeszcze tego nie ogarniam). Mnie to po prostu
wyglądało, że log jest importowane do przestrzeni module4 i zmiana
przypisania do tej zmiennej w module 1 nie jest odzwierciedlana w
module4. Inaczej jest jeśli odwołuję się przez module1.log. Wtedy
odwołuję się do zmiennej właśnie w tamtej przestrzeni nazw (module1).
Nie wiem czy to wyjaśnienie jest zbieżne z tym co ty napisałeś (i
prawidłowe) ale tłumaczy to zachowanie i jest tym co chciałem na
początku przekazać w pierwszym poście.
Ze względu na to, że projekt będzie pewnie trochę większy, zrozumienie
tego ma dla mnie duże znaczenie. Dlatego też, nie chciałbym przenosić
log do modułu w którym jest Log bo chciałbym takie rzeczy trzymać
razem w jednym module aby się później nie pogubić (gdzie ja to
umieściłem.)

Jeszcze raz dziękuję za wyjaśnienie i pozdrawiam.
Technical Details
Message-ID: <9f79d13b-c1a4-443d-9c68-82c088f64763@k17g2000yqh.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!k17g2000yqh.googlegroups.com!not-for-mail
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> <219429b1-25a3-43a5-b074-16a97e723772@p8g2000yqb.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!k17g2000yqh.googlegroups.com!not-for-mail
From: Michal M <mmierzwa@tycowaterworks.pl>
Newsgroups: pl.comp.lang.python
Subject: Re: Python i importowanie
Date: Sun, 20 Dec 2009 14:40:04 -0800 (PST)
Organization: http://groups.google.com
Lines: 132
Message-ID: <9f79d13b-c1a4-443d-9c68-82c088f64763@k17g2000yqh.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>  <219429b1-25a3-43a5-b074-16a97e723772@p8g2000yqb.googlegroups.com>
NNTP-Posting-Host: 93.179.233.50
Mime-Version: 1.0
X-Trace: posting.google.com 1261348804 25447 127.0.0.1 (20 Dec 2009 22:40:04 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Sun, 20 Dec 2009 22:40:04 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: k17g2000yqh.googlegroups.com; posting-host=93.179.233.50;  posting-account=dY1QvgoAAADCWl8YwEq83L_41SxqMaon
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)  AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.38 Safari/532.0,gzip(gfe),gzip(gfe)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit