Reťazenie metód v Pythone

Majme fiktívnu triedu, ktorá umožňuje pracovať s obrázkami.

img = Image()  
img.read('/tmp/image.png')  
img.resize(100, 100)  
img.save_jpg()  

Ak by sme použili návrhový vzor Builder tak by sme mohli danú triedu zapísať nasledovne.

Image().read('/tmp/image.png').resize(100, 100).save_jpg()  

Zápis je kratší a podľa mňa aj elegantnejší, problém nastáva keď zreťazíme veľa metód a riadok už je príliš dlhý. Skúsme ho zapísať trocha inak.

Image().read('/tmp/image.png')  
    .resize(100, 100)
    .save_jpg()

Tímto sa síce kód s viacerými metódami sprehladnil, ale má to jeden háčik, nie je to valídny Python kód a nedá sa spustiť. Aby bol valídny, musel by byť zapísaný takto:

Image().read('/tmp/image.png') \  
    .resize(100, 100) \
    .save_jpg()

Niekomu sa nemusí páčiť zapisovanie spätného lomítka na konci každého riadku, tak tento zápis môžeme zapísať ešte inak:

(Image().read('/tmp/image.png')
    .resize(100, 100)
    .save_jpg())

Nie je to úplne ideálne riešenie, skoro to až zaváňa Lispom. Ale stále lepšie ako nič :)

Ešte ukážka jednoduchej implementácie návrhového vzoru Builder v Pythone.

class Test:  
    def step1(self):
        print "step1"
        return self

    def step2(self):
        print "step2"
        return self

    def step3(self):
        print "step3"
        return self

Test().step1().step2().step3()  
Show Comments