[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