🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
11 messages
11 total messages Started by pythonlogist.SKASUJ Mon, 11 May 2009 19:51
Klasa jako slownik
#26069
Author: pythonlogist.SKASUJ
Date: Mon, 11 May 2009 19:51
27 lines
1581 bytes
witam,
pisze dosc skomplikowana klase dziedziczaca po kilku innych klasach i nie moge
dojsc z tym do ladu.

Chcialbym mianowicie, zeby moja klasa przedstawiala sie jako slownik. Problem
w tym, ze potrafie to zrobic tylko kiedy dzidziczy ona bezposrednio po dict:

class A(dict): pass

ja natomiast nie moge sobie na to pozwolic, bo moje pozostale klasy bazowe
nadpisuja np. __init__() tudziez inne wbudowane metody obiektow Pythona i A()
przestaje sie zachowywac jak slownik.

Jaki jest minimalny warunek tego, zeby moja klasa w przypadku przypisania jej
do zmiennej zwracala jej wewnetrzy slownik a nie Nia sama?:

a = A() # inicjuje
b = a   # ale pod 'b' nie bedzie klasy a, lecz slownik, ktory w nia wbudowalem
w definicji klasy.


Dzikuje za pomoc.
pozdrawiam,
skk.

-- 
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: Klasa jako slownik
#26073
Author: pythonlogist.WYTNIJ
Date: Mon, 11 May 2009 19:59
20 lines
1129 bytes
.. i jeszcze dodatkowe pytanie, jesli mozna:

jak zrobic, aby w ponizszym kodzie:

class B(object):
   def __init__(self,v):
      self.v = v

class A(dict, B): pass

a = A(slownik)

inicjacja A(), wykonala __init__() obu klas bazowych? (tj. slownika oraz B)


dziekuje.
skk. 

-- 
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: Klasa jako slownik
#26070
Author: Marek Wywiał
Date: Mon, 11 May 2009 20:51
37 lines
2306 bytes
On 11 Maj, 21:51, " " <pythonlogist.SKA...@gazeta.pl> wrote:
> witam,
> pisze dosc skomplikowana klase dziedziczaca po kilku innych klasach i nie moge
> dojsc z tym do ladu.
>
> Chcialbym mianowicie, zeby moja klasa przedstawiala sie jako slownik. Problem
> w tym, ze potrafie to zrobic tylko kiedy dzidziczy ona bezposrednio po dict:
>
> class A(dict): pass
>
> ja natomiast nie moge sobie na to pozwolic, bo moje pozostale klasy bazowe
> nadpisuja np. __init__() tudziez inne wbudowane metody obiektow Pythona i A()
> przestaje sie zachowywac jak slownik.
>
> Jaki jest minimalny warunek tego, zeby moja klasa w przypadku przypisania jej
> do zmiennej zwracala jej wewnetrzy slownik a nie Nia sama?:
>
> a = A() # inicjuje
> b = a   # ale pod 'b' nie bedzie klasy a, lecz slownik, ktory w nia wbudowalem
> w definicji klasy.
>
> Dzikuje za pomoc.
> pozdrawiam,
> skk.
>
> --
> Wysłano z serwisu Usenet w portalu Gazeta.pl ->http://www.gazeta.pl/usenet/

class A(dict): pass

a = A()
type a
<class '__main__.A'>

b = a
type b
<class '__main__.A'>
Re: Klasa jako slownik
#26074
Author: forgems
Date: Mon, 11 May 2009 21:10
36 lines
2200 bytes
On May 11, 9:59 pm, " " <pythonlogist.WYT...@gazeta.pl> wrote:
> .. i jeszcze dodatkowe pytanie, jesli mozna:
>
> jak zrobic, aby w ponizszym kodzie:
>
> class B(object):
>    def __init__(self,v):
>       self.v = v
>
> class A(dict, B): pass
>
> a = A(slownik)
>
> inicjacja A(), wykonala __init__() obu klas bazowych? (tj. slownika oraz B)
>
> dziekuje.
> skk.
>
> --
> Wysłano z serwisu Usenet w portalu Gazeta.pl ->http://www.gazeta.pl/usenet/

class B(object):
    def __init__(self,v):
       self.v = v

class A(dict, B):
    def __init__(self,v): #nadpisz konstruktor
        super(A,self).__init__()#kooperatywnie wywolaj konstruktory
domyslne klas wyzszych
        B.__init__(self,v)#jawnie wywolaj konstruktor klasy nadrzednej

 a = A(slownik)

Ale ogólnie chyba robisz coś złego :)
Poczytaj o new style classes
http://www.python.org/download/releases/2.2.3/descrintro/
Re: Klasa jako slownik
#26079
Author: Radomir Dopieralski
Date: Mon, 11 May 2009 21:14
42 lines
2212 bytes
At Mon, 11 May 2009 19:59:25 +0000 (UTC),   wrote:

> .. i jeszcze dodatkowe pytanie, jesli mozna:
>
> jak zrobic, aby w ponizszym kodzie:
>
> class B(object):
>    def __init__(self,v):
>       self.v = v
>
> class A(dict, B): pass
>
> a = A(slownik)
>
> inicjacja A(), wykonala __init__() obu klas bazowych? (tj. slownika oraz B)
>

Mozna explicite:

class A(dict, B):
    def __init__(self, v, *args, **kw):
        dict.__init__(self, *args, **kw)
        B.__init__(self, v, *args, **kw)

albo mozna bardziej elegancko:

class B(object):
    def __init__(self, v, *args, **kw):
        super(B, self).__init__(*args, **kw)
        self.v = v

class A(dict, B):
    def __init__(self, *args, **kw):
        super(A, self).__init__(*args, **kw)
        ...

czy cos w ten desen (nigdy do konca nie rozumialem jak dokladnie ma
dzialac wielokrotne dziedziczenie czegokolwiek innego niz interfejsow
albo mixinow).

-- 
Radomir Dopieralski, http://sheep.art.pl
Re: Klasa jako slownik
#26077
Author: Radomir Dopieralski
Date: Mon, 11 May 2009 21:20
49 lines
2571 bytes
At Mon, 11 May 2009 19:51:27 +0000 (UTC),   wrote:

> witam,
> pisze dosc skomplikowana klase dziedziczaca po kilku innych klasach i nie moge
> dojsc z tym do ladu.
>
> Chcialbym mianowicie, zeby moja klasa przedstawiala sie jako slownik. Problem
> w tym, ze potrafie to zrobic tylko kiedy dzidziczy ona bezposrednio po dict:
>
> class A(dict): pass
>
> ja natomiast nie moge sobie na to pozwolic, bo moje pozostale klasy bazowe
> nadpisuja np. __init__() tudziez inne wbudowane metody obiektow Pythona i A()
> przestaje sie zachowywac jak slownik.
>
> Jaki jest minimalny warunek tego, zeby moja klasa w przypadku przypisania jej
> do zmiennej zwracala jej wewnetrzy slownik a nie Nia sama?:
>
> a = A() # inicjuje
> b = a   # ale pod 'b' nie bedzie klasy a, lecz slownik, ktory w nia wbudowalem
> w definicji klasy.
>

Tak sie nie da. Mozesz natomiast zrobic tak, zeby a[x] dawalo
a.slownik[x]:

class A(object):
    def __init__(self, **kw):
        self.wrapped_dict = kw

    def __getitem__(self, key):
        return self.wrapped_dict[key]

    def __setitem__(self, key, value):
        self.wrapped_dict[key] = value

    def __delitem__(self, key):
        del self.wrapped_dict[key]

    def __iter__(self):
        return iter(self.wrapped_dict)

etc.

WIecej tych "magicznych metod" jest na
http://docs.python.org/reference/datamodel.html

-- 
Radomir Dopieralski, http://sheep.art.pl
Re: Klasa jako slownik
#26071
Author: Filip Wasilewski
Date: Mon, 11 May 2009 21:45
67 lines
4210 bytes
On May 11, 9:51 pm, " " <pythonlogist.SKA...@gazeta.pl> wrote:
> witam,
> pisze dosc skomplikowana klase dziedziczaca po kilku innych klasach

Po pierwsze, to nie wygląda na dobry pomysł. Jaki problem tak naprawdę
chcesz rozwiązać?

> i nie moge
> dojsc z tym do ladu.
>
> Chcialbym mianowicie, zeby moja klasa przedstawiala sie jako slownik. Problem
> w tym, ze potrafie to zrobic tylko kiedy dzidziczy ona bezposrednio po dict:
>
> class A(dict): pass

W zasadzie na powyższym pytaniu powinienem poprzestać i zaczekać na
więcej informacji, ale postaram się

Aby klasa zachowywała się jak słownik, powinna implementować metody z
interfejsu słownika [1, 2]. W wielu przypadkach, gdy potrzebna jest
niewielka zmiana zachowania `dict`, wystarczy proste dziedziczenie po
tym typie i nadpisanie niektórych metod. W pozostałych można wspomóc
się `DictMixin` [3] lub zaimplementować wszystkie niezbędne metody [1]
samemu.

> ja natomiast nie moge sobie na to pozwolic, bo moje pozostale klasy bazowe
> nadpisuja np. __init__() tudziez inne wbudowane metody obiektow Pythona i A()
> przestaje sie zachowywac jak slownik.

W klasie pochodnej powinieneś wywoływać konstruktory/metody klas
bazowych w celu uzyskania odpowiedniego działania. Jest to zasadnicza
wiedza z zakresu programowania obiektowego, więc odsyłam do tutoriali/
dokumentacji [4,5,6,7]. Jednocześnie zwracam uwagę na potencjalne
problemy czyhające przy dziedziczeniu wielobazowym, jak np. kolejność
wywoływania metod w klasach "nowego stylu" [6,7] czy różnice w
sygnaturach metod. Osobiście unikam dziedziczenia wielobazowego (może
z małym wyjątkiem "mixinów"), gdyż jest przyczyną zbyt wielu
problemów.

> Jaki jest minimalny warunek tego, zeby moja klasa w przypadku przypisania jej
> do zmiennej zwracala jej wewnetrzy slownik a nie Nia sama?:

Taki warunek nie istnieje. Nie można przeciążyć operatora przypisania
w taki sposób (w żaden sposób), aby dokonywał jakiejś bliżej
nieokreślonej konwersji typu. Python nie daje aż takich możliwości
gmatwania programów!

> a = A() # inicjuje
> b = a   # ale pod 'b' nie bedzie klasy a, lecz slownik, ktory w nia wbudowalem
> w definicji klasy.

Do `A` dodaj metodę `A.as_dict()` lub dokonuj konwersji jawnie przy
pomocy `dict(a)` (o ile oczywiście uprzednio zaimplementowałeś
odpowiedni interfejs [1]). Będzie wtedy wiadomo, czego można się
spodziewać w wyniku tej operacji.

[1] http://www.python.org/doc/2.6/reference/datamodel.html#emulating-container-types
[2] http://www.python.org/doc/2.6/library/stdtypes.html#typesmapping
[3] http://www.python.org/doc/2.6/library/userdict.html#UserDict.DictMixin
[4] http://www.diveintopython.org/object_oriented_framework/index.html
[5] http://www.python.org/doc/2.6/tutorial/classes.html
[6] http://www.python.org/download/releases/2.3/mro/
[7] http://www.python.org/doc/2.6/library/functions.html#super

--
Filip Wasilewski
http://filipwasilewski.pl/
Re: Klasa jako slownik
#26072
Author: pythonlogist.WYTNIJ
Date: Wed, 13 May 2009 16:11
9 lines
997 bytes
Dziekuje za wyczerpujaca odpowiedz! 

Musze nad tym jeszcze pomyslec. 

pozdrawiam!
skk.

-- 
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: Klasa jako slownik
#26075
Author: Sulsa
Date: Wed, 20 May 2009 19:33
21 lines
1285 bytes
On Mon, 11 May 2009 14:10:16 -0700 (PDT)
forgems <forgems@gmail.com> wrote:


> class B(object):
>     def __init__(self,v):
>        self.v = v
> 
> class A(dict, B):
>     def __init__(self,v): #nadpisz konstruktor
>         super(A,self).__init__()
>         B.__init__(self,v)
> 

czym sie roznie wywolanie konstruktora przez super od wywolania
konstruktora przez nazwe klasy(w tym przypadku B.__init__)




-- 
Re: Klasa jako slownik
#26076
Author: Jacek Czerwinski
Date: Thu, 21 May 2009 10:00
21 lines
1558 bytes
Sulsa pisze:
> On Mon, 11 May 2009 14:10:16 -0700 (PDT)
> forgems <forgems@gmail.com> wrote:
> 
> 
>> class B(object):
>>     def __init__(self,v):
>>        self.v = v
>>
>> class A(dict, B):
>>     def __init__(self,v): #nadpisz konstruktor
>>         super(A,self).__init__()
>>         B.__init__(self,v)
>>
> 
> czym sie roznie wywolanie konstruktora przez super od wywolania
> konstruktora przez nazwe klasy(w tym przypadku B.__init__)

Nie wiem jak w pythonie, ale z notacją 'super' (np. w javie) się łatwiej 
zmienia hierarchię klas. Z nazwą klasy wymaga to przeklepania (znów, 
niektórym wyższa kontrola może pasować)
Re: Klasa jako slownik
#26078
Author: Radomir Dopieralski
Date: Thu, 21 May 2009 10:09
26 lines
1986 bytes
At Wed, 20 May 2009 21:33:12 +0200, Sulsa wrote:

> On Mon, 11 May 2009 14:10:16 -0700 (PDT)
> forgems <forgems@gmail.com> wrote:
>
>
>> class B(object):
>>     def __init__(self,v):
>>        self.v = v
>> 
>> class A(dict, B):
>>     def __init__(self,v): #nadpisz konstruktor
>>         super(A,self).__init__()
>>         B.__init__(self,v)
>> 
>
> czym sie roznie wywolanie konstruktora przez super od wywolania
> konstruktora przez nazwe klasy(w tym przypadku B.__init__)

W tym drugim przypadku wiesz co wolasz. Jak uzywasz super, to wolasz
inicjalizacje (to nie jest konstruktor!) ktorejs z klas z drzewa
dziedziczenia, ale przy wielokrotnym dziedziczeniu nie wiesz dokladnie
ktorej.

-- 
Radomir Dopieralski, http://sheep.art.pl
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads