[python] Metody korenoveho objektu

Radek Kanovsky rk na dat.cz
Úterý Duben 1 15:58:28 CEST 2003


On Tue, Apr 01, 2003 at 03:15:58PM +0200, Ondrej Nekola wrote:

> High order messages, Zpravy (terminologii pythonu asi metody) vyssich radu. 
> Umozni to psat takove veci jako:
> 
> kontejnerWoken.each().close()
> (zavola vsechny metodu close u kazdeho okna)

map(lambda x: x.close(), kontejnerWoken)

> kontejnerWoken.collect().maMinimalizacniTlacitko()
> (udela seznam oken, ktere maji minimalisacni tlacitko)

filter(lambda x: x.maMinimalizacniTlacitko(), kontejnerWoken)

> wokno.afterDelay(6000).close()
> (za minutu zavre okno)


def afterDelay(t, meth, *a, **kw) :
    time.sleep(t)
    apply(meth, a, kw)

afterDelay(60, wokno.close)

> serwer.repeatWithDelay(6000).ping()
> (kazdou minutu pingne server)

Podobne jako predchozi.

> For je v tom, ze tyto metody by mely vytvaret moznost, jak pracovat se vsemi 
> objekty, protoze by to mel byt obecny mechanismus. Nechce se mi delat si 
> vlastniho spolecneho predka, protoze ten neobsahne vsechny objekty v systemu.

S tou syntaxi, kterou navrhujete to asi obecne nepujde, ale stejne
nechapu, proc ma mit treba instance float(2.2) metodu afterDelay().
Udelat tu metodu pro konkretni tridu asi problem neni:

class Delayed :
    
    def afterDelay (self, t) :
        time.sleep(t)
        return self


Jinak na vsechny objekty se lze dostat pres gc.get_objects(). Ale uz po startu
je jich vic nez tisic, takze prochazet je porad dokola asi nepripada v uvahu.
Mozna by se to dalo optimalizovat pres volani gc.get_referrers(*obj).
Na seznam vsech instanci dane tridy by se melo jit dostat nejak takto:

def inst_list (cls) :
    return filter(lambda x: isinstance(x, cls), gc.get_referrers(cls))

(vse bez zaruky)

Zdravi

Radek Kaòovský


Další informace o konferenci Python