[python] class a subclass
Petr Přikryl
prikryl na atlas.cz
Neděle Listopad 12 13:04:40 CET 2006
Ještě jednou se vrátím k původnímu dotazu. Kdybych přece jen
chtěl něco takového, abych u instance mohl dynamicky rozhodovat,
jaká varianta metody se má volat (zda rodičovský kód nebo
kód potomka) a kdyby se o tom mělo rozhodovat například
zvnějšku, mohu použít prostředníka...
mtip napsal(a):
> [...]
> class a:
> def prn(self):
> print 'a',self
> def ma(self):
> self.prn()
>
> class b(a):
> def prn(self):
> print 'b',self
> def ma(self):
> '''prekryje a.ma()'''
> a.ma(self)
>
> x=b()
> x.ma()
>
> vysledkem je print z metody b.prn, a ja bych potreboval aby byl a.prn
Nadefinujeme referenci self.prnX, která bude obsahovat buď odkaz
na rodičovský kód metody nebo na potomkův kód metody. Metoda ma()
nebude volat prn() přímo, ale prostřednictvím prnX(). Budeme
přepínat voláním funkce setPrn?(). Příklad:
class a:
def __init__(self):
self.setPrnA()
def prn(self):
print 'a',self
def setPrnA(self):
self.prnX = a.prn
def ma(self):
self.prnX(self)
class b(a):
def __init__(self):
a.__init__(self)
self.setPrnB()
def prn(self):
print 'b',self
def ma(self):
'''prekryje a.ma()'''
a.ma(self)
def setPrnB(self):
self.prnX = b.prn
x=b()
x.ma()
x.setPrnA()
x.ma()
x.setPrnB()
x.ma()
Pokud se nepletu, tak se tomu po zobecnění říká Strategy Pattern
nebo delegace (moc silný v teorii tady nejsem). Jde o to, že
chci provádět nějakou činnost, která má pro mě jakýsi abstraktní
význam (například tisk), ale teprve za běhu chci upřesnit, kterou
variantu oné abstraktní operace budu chtít používat.
(Lovím to z hlavy. Možná jsem tady trochu nepřesný.)
pepr
Další informace o konferenci Python