זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/20-class-syntax
זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/20-class-syntax
שלום,
תודה על הקורס הברור והמקצועי.
שאלה בנוגע למשתני מחלקה פרטיים - private properties.
באמצעות משחק בקוד, הבנתי שתחילית קו תחתי כפול למשתנה (__) גורמת לו להיות פרטי לגמרי
(private get and private set)
האם זו הדרך הנכונה למניעת שינוי של משתנים מבחוץ?
הי,
המשמעות של תחילית קו תחתון בפייתון היא אך ורק קונבנציה. כלומר אפשר לגשת לכל משתנה גם לכאלה שמתחילים בקו תחתון בלי בעיה.
לגבי תחילית קו תחתון כפול הדבר יוצר באופן אוטומטי שינוי שם של המשתנה כך שיכלול גם את שם המחלקה. אני חושב שהקוד הבא ממחיש את העניין:
class Foo:
def __init__(self):
self.__secret = 10
def print(self):
print(self.__secret)
f = Foo()
# prints 10
f.print()
f._Foo__secret = 20
# prints 20
f.print()
אנחנו עדיין יכולים לגשת למשתנה פשוט השם שלו שונה. זה עוזר במקרים של ירושה כשאנחנו רוצים שבאופן אוטומטי פייתון יוסיף תחילית ייחודית לשם של משתנה כדי שמחלקה יורשת לא תשנה את המשתנה בטעות.
היי ynonp@ ראשית כל תודה רבה לך על הסרטונים וההדרכה. רציתי לשאול לגבי חלק שלא הופיע בהדרכת הוידאו אבל כן בטקסט הכתוב: בחלק האחרון יש מופע של קוד שמגדיר את המע"מ עבור מספר מדינות ואז יש פקודה שנקראת @staticmethod לא הבנתי את המשמעות שלה אם ניתן יהיה לפרט.
קובי
הי @kobic8
בדרך כלל בתכנות מונחה עצמים, פונקציה בתוך אוביקט (נקראת “מתודה”) מקבלת בתור פרמטר ראשון את האוביקט.
הנה מהדוגמה של הנורה:
def turn_on(self):
if self.is_on: return
print("Lights On")
self.is_on = True
אתה רואה את המילה self שזה הפרמטר הראשון לפונקציה, ונועד כדי שהפונקציה תוכל להתיחס למידע ששמור בתוך האוביקט.
אבל, יש גם מתודות שלא צריכות את המידע ששמור באוביקט הספציפי. בטקסט כתבתי שם דוגמה לפונקציית מע"מ כי המע"מ הוא קבוע לכל החשבוניות. פונקציה כזאת לא צריכה את האוביקט עצמו ואנחנו גם מפעילים אותה אחרת. תראה דוגמה לקוד שמשתמש במחלקה נורה:
l = LightBulb()
l.turn_on()
ולעומתו הקוד שמשתמש בפונקציית המע"מ:
print(Invoice.vat_by_country("Israel"))
לא יצרתי אוביקט חדש והפעלתי “בעזרתו” את הפונקציה, אלא הפעלתי את הפונקציה ישירות דרך המחלקה. בצד של הפונקציה היא גם לא מקבלת self בתור פרמטר ראשון כי אין אוביקט self, הוא לא נוצר.
הכתיב של ה @ לפני המילה staticmethod נקרא Decorator ויש עליו שיעור בקורס המתקדם כאן:
https://www.tocode.co.il/bundles/advanced-python3/lessons/decorators