זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/decorators
זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/decorators
לא מבין למה צריך את הדקורטור - זה בדיוק השימוש בלמבדה
גם לא מובן בדיוק - איך זה עובד הדקורטור בתוך הדקורטור
כן הוא כזה
תחשוב על מצב שיש לך קוד חיצוני (לא שלך) ואתה רוצה להוסיף התנהגות לפונקציה קיימת,
למשל אתה רוצה לגרום לפונקציה מסוימת להדפיס כמה זמן לקח לה לעבוד,
אבל אתה לא רוצה לשנות את קוד הפונקציה עצמה כי לא אתה כתבת אותה ואולי אין לך גישה.
דקורטור נותן לך את היכולת לשנות התנהגות של פונקציה בלי לגעת בקוד שלה. מקרה אחד של שימוש הוא כמובן שיתוף קוד בין פונקציות ומקרים נוספים קשורים לתרחישים נוספים סביב הסיפור הזה.
אפשר ומומלץ לראות גם את ההסבר שלי על אותו הנושא מהקורס המתקדם:
https://www.tocode.co.il/bundles/advanced-python3/lessons/decorators
וגם לראות את הדוגמאות הנוספות בפרק ״תרגול Decorators״:
https://www.tocode.co.il/bundles/python/lessons/decorators-lab
אבל בגדול כן זה נושא יחסית מתקדם ולוקח זמן להתרגל אליו.
זה נכון - אבל אם הפונקציות הם חיצוניות אז לא אוכל לסמן אותם גם בדקורטור שלי מעליהם - כך שאין לזה משמעות רק אם הקוד של הפונקציות הללו הוא ברשותי
לא מדויק-
- תמיד אפשר ״לעטוף״ פונקציה חיצונית בקוד שלך באצמעות כתיבה מפורשת למשל כך:
def debug(f):
def wrapper(*args, **kwargs):
print('--- debug')
print(*args)
print('--- end')
return f(*args, **kwargs)
return wrapper
sum = debug(sum)
print(sum([1, 2, 3]))
יותר מזה יש הרבה מצבים שאתה רוצה בקוד ״להוסיף״ או ״להוריד״ התנהגות בשורה בודדת (גם על פונקציות שלך)
ויש הרבה מצבים אחרים שאתה כותב Generator ונותן אותו למישהו אחר. באחד התרגילים כתבת את ה Decorator שנקרא memoize. מסתבר למשל שיש כזה מובנה בפייתון ואפשר לקרוא עליו כאן:
https://docs.python.org/3/library/functools.html#functools.lru_cache
אותו Memoize כתוב כ Decorator כדי שהרבה תוכניות יוכלו להשתמש בו.
ה Decorator נותן לך עוד תבנית לשיתוף קוד בין חלקים ביישום. משתמשים בו יותר בתוכניות גדולות או בקוד של ספריה שהרבה תוכניות ישתמשו בה. ובכל זאת חשוב להכיר כי יש די הרבה כאלה בספריה הסטנדרטית של פייתון.