🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Python i importowanie

#27049
From: marmarprog
Date: Sun, 20 Dec 2009 22:02
97 lines
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-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>

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