Article View: pl.comp.lang.python
Article #27070Re: Python i importowanie
From: Michal M
Date: Sun, 20 Dec 2009 22:40
Date: Sun, 20 Dec 2009 22:40
120 lines
5304 bytes
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-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> <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