Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Niepełne dziedziczenie

5 views
Skip to first unread message

eliasz

unread,
Jan 8, 2009, 12:05:40 PM1/8/09
to
Mam dwie klasy

class A:
a = 'a'
b = 'b'

class B(A):
pass

class C(A):
pass

Klasa A jest bazową, dziedziczną po niej 2 inne klasy B, C. Pytanie to
jak zrobić, aby klasa B nie dziedziczyła atrybutu a po klasie A?
Prywatną nie mogę zrobić, bo dziedziczyć wszystko po A ma C. Wiem, że
filozofia tutaj kulawa, ale niestety musi tak być (fragment sporego
programu).

Filip Wasilewski

unread,
Jan 8, 2009, 12:33:43 PM1/8/09
to
On 8 Sty, 18:05, eliasz <eliasz.wont...@gmail.com> wrote:
> Mam dwie klasy
>
> class A:
>   a = 'a'
>   b = 'b'
>
> class B(A):
>   pass
>
> class C(A):
>   pass

Mniej-więcej dwie ;)

> Klasa A jest bazową, dziedziczną po niej 2 inne klasy B, C. Pytanie to
> jak zrobić, aby klasa B nie dziedziczyła atrybutu a po klasie A?
> Prywatną nie mogę zrobić, bo dziedziczyć wszystko po A ma C. Wiem, że
> filozofia tutaj kulawa, ale niestety musi tak być (fragment sporego
> programu).

class A:
b = 'b'

class A1(A):
a = 'a'

class B(A):
pass

class C(A1):
pass

Czy taka hierarchia dziedziczenia rozwiązuje problem, a jeśli nie, to
dlaczego?

f

eliasz

unread,
Jan 8, 2009, 2:51:29 PM1/8/09
to

Owszem, podobnie zrobiłem. Chodziło mi bardziej o dostanie się podczas
tworzenia obiektu tej klasy, która dziedziczy do dziedziczonych
parametrów i usunięcie niektórych, np takie coś jest poprawne: (?)

class B(A):
def __init(self)__:
del a

Filip Wasilewski

unread,
Jan 8, 2009, 5:15:59 PM1/8/09
to

Byłoby to możliwe (`del self.a`), gdyby atrybut `a` był atrybutem
instancji, a nie klasy bazowej.

Zerknij na wyjaśnienie sposobu, w jaki Python realizuje dostęp do
atrybutów instancji i klas bazowych w klasach pochodnych [1]. Jest to
kluczowe do zrozumienia, co tak naprawdę dzieje się w trakcie
wywołania `B.a`.

Ponieważ wspomniane w przykładzie atrybuty są atrybutami klasy (a nie
konkretnego obiektu), nie można ich usunąć z klasy (przestrzeni nazw),
w której nie zostały zdefiniowane.

Dostęp do `B.a` jest możliwy ze względu na [1], ale już `del B.a` nie
(w odróżnieniu od `del A.a`, co raczej nie jest pożądane).

To co można natomiast zrobić, to zasymulować "niezdefiniowanie"
atrybutu w klasie pochodnej poprzez jego przesłonięcie deskryptorem
[2, 3]:

###
class Undefined(object): ## <- uwaga, klasa nowego stylu
def __get__(self, instance, owner):
raise AttributeError("class %s has no attribute" %
owner.__name__)

class A(object):


a = 'a'
b = 'b'

class B(A):
a = Undefined()

print A.a
print B.a
B.a = 5
print B.a
###

Tak czy siak, zalecałbym rozwiązanie z dziedziczeniem z poprzedniego
postu jako najbardziej logiczne.

[1] http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy
(punkty 'Classes' i 'Class instances')
[2] http://docs.python.org/reference/datamodel.html#descriptors
[3] http://users.rcn.com/python/download/Descriptor.htm

f

eliasz

unread,
Jan 9, 2009, 6:36:37 AM1/9/09
to

Krzysztof Kotlenga

unread,
Jan 9, 2009, 11:16:35 AM1/9/09
to
eliasz wrote:

>> [105 linii]


>
> dzięki za linki, poczytam sobie...

Ten też jest ekstra:
http://netmeister.org/news/learn2quote2.html#ss2.1

--
Research is what I'm doing when I don't know what I'm doing.
-- Wernher von Braun

0 new messages