Thread View: pl.comp.lang.python
11 messages
11 total messages
Started by pythonlogist.SKASUJ
Mon, 11 May 2009 19:51
Klasa jako slownik
Author: pythonlogist.SKASUJ
Date: Mon, 11 May 2009 19:51
Date: Mon, 11 May 2009 19:51
27 lines
1581 bytes
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
Author: pythonlogist.WYTNIJ
Date: Mon, 11 May 2009 19:59
Date: Mon, 11 May 2009 19:59
20 lines
1129 bytes
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
Author: Marek Wywiał
Date: Mon, 11 May 2009 20:51
Date: Mon, 11 May 2009 20:51
37 lines
2306 bytes
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
Author: forgems
Date: Mon, 11 May 2009 21:10
Date: Mon, 11 May 2009 21:10
36 lines
2200 bytes
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
Author: Radomir Dopieralski
Date: Mon, 11 May 2009 21:14
Date: Mon, 11 May 2009 21:14
42 lines
2212 bytes
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
Author: Radomir Dopieralski
Date: Mon, 11 May 2009 21:20
Date: Mon, 11 May 2009 21:20
49 lines
2571 bytes
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
Author: Filip Wasilewski
Date: Mon, 11 May 2009 21:45
Date: Mon, 11 May 2009 21:45
67 lines
4210 bytes
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
Author: pythonlogist.WYTNIJ
Date: Wed, 13 May 2009 16:11
Date: Wed, 13 May 2009 16:11
9 lines
997 bytes
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
Author: Sulsa
Date: Wed, 20 May 2009 19:33
Date: Wed, 20 May 2009 19:33
21 lines
1285 bytes
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
Author: Jacek Czerwinski
Date: Thu, 21 May 2009 10:00
Date: Thu, 21 May 2009 10:00
21 lines
1558 bytes
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
Author: Radomir Dopieralski
Date: Thu, 21 May 2009 10:09
Date: Thu, 21 May 2009 10:09
26 lines
1986 bytes
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