Python dekoratorok

  • 389 views
Uploaded on

Veszprem meetup slides from 02/07/2012

Veszprem meetup slides from 02/07/2012

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
389
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
2
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Dekorátor pattern OOP pattern Meglévő objektum funkciójának bővítése Nem befolyásolja az eredeti objektum viselkedését  Közvetlenül legalábbis    
  • 2. Függvény­dekorátor Funkcionális pattern/eszköz Függvény viselkedésének módosítása a függvény  módosítása nélkül. Matematikában elsőrendű függvénynek nevezik. Funkcionális nyelvek régóta használnak hasonló  patterneket.    
  • 3. Hogyan működik? A dekorátor egy függvény Paramétere is függvény Visszatérési érték is függvény!    
  • 4. Hogyan működik?@decorator @decorator @decorator(decorator_args)def something(arguments): def foo(arguments): def foo(arguments): ... ... ... def foo(arguments): … foo = decorator(foo) def foo(arguments): … foo = decorator(decorator_args)(something)    
  • 5. Példa: viselkedés módosítása Átalakítja a függvény viselkedését! def mapper(func): def __wrapper(*args): return [func(arg) for arg in args] return __wrapper @mapper def cube(value): return value ** 3 print cube(1, 2, 3) # >>> [1, 8, 27]   
  • 6. Példa: függvényhívás loggolása Nem befolyásolja a függvény viselkedését lényegesendef log(func): def __wrapper(*args, **kwargs): print ”Entering function %s” % func.__name__ try: return func(*args, **kwargs) finally: print ”Exiting function %s” % func.__name__ return __wrapper    
  • 7. Példa: függvény megjelölése Nem befolyásolja a függvény viselkedését sehogyan def mark(function): function.marked = True return function @mark def marked_function(arg): ... if getattr(marked_function, marked, False): ...   
  • 8. Milyen problémákra célszerű  használni? unit teszt suite függvényeinek gyűjtése  Alternatíva a név alapján történő gyűjtésre Parancskezelő függvények regisztrációja Eseménykezelő függvények regisztrációja Metainformáció hozzáadása függvényhez    
  • 9. Mire figyeljünk? Minnél jobban módosítunk a viselkedésen, annál  nehezebb debuggolni  nehezebb karbantartani  több a lehetséges hiba    
  • 10. Mire figyeljünk? A ”függvény megjelölése” példa jó ilyen  szempontból  A függvény viselkedése nem változik  Minden, ami igaz volt a függvényre dekorálás előtt,  az igaz utána is.    
  • 11. Más nyelvekben C: nincs közvetlenül lehetőség rá, kerülőkkel  megoldható C++: template/funktorok (függvényként viselkedő  objektumok) Java: dekorátor pattern, annotáció (viselkedés  módosítás nélkül)