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).
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
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
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
dzięki za linki, poczytam sobie...
>> [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