זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/special-methods
זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/special-methods
הי,
לא הבנתי כמה דברים:
- בשיעור הוידאו אתה כותב כך:
def __eq__(self,other):
if type(other) == Point:
return (self.x == other.x and self.y == other.y)
ואילו בטקסט המלווה את השיעור כתבת:
def __eq__(self,other):
if isinstance(other, Point):
return self.x == other.x and self.y == other.y
האם זה אותה הבדיקה או לא?
-
לעצם הבדיקה, לא הבנתי איך היא מתבצעת הרי אין כאן שום קריאה לאף פונקציה אלא בסה"כ הגדרה של אובייקטים אז איך נעשית הפניה לפונקציות השונות במחלקה? בנוסף, אנו לא רוצים שכל הפונקציות יופעלו בכל פעם אלא לפי צרכינו. איך מגדירים זאת?
-
לפי מה שהבנתי עד עכשיו, כל פעם אובייקט אחר “משתלט” על המחלקה וכל הפונקציות במחלקה (כולל המונח self) מתעדכנות לפיו.
אם כך , איך מתבצעת ההשוואה בין האובייקטים? אני משער שזו ההשוואה בין self ל other אך לא הבנתי איך זה מתבצע. אם בכל פעם רק אובייקט אחד “משתלט” על המחלקה וכל העדכונים הם לפיו אז איך אפשר להשוות אותו עם אובייקט אחר שכרגע לא מטופל?
הי,
אשלח אותך למסע חיפוש קטן ברשותך - נסה למצוא ברשת מה ההבדל בין isinstance ל type וספר לי אתה מה ההבדל בין הבדיקות ומתי תעדיף כל בדיקה (הן לא אותו דבר)
עכשיו לשאלות כמו שכשאתה כותב:
x = Item()
מופעלת הפונקציה:
Item.__init__
באופן אוטומטי, כך גם פעולות אחרות מפעילות פונקציות אחרות באופן אוטומטי. למשל כשאתה כותב את הפקודות:
x = Item()
y = Item()
if x == y:
print '1'
באופן אוטומטי השורה השלישית גורמת להפעלת הפונקציה:
Item.__eq__
בפייתון לכל פעולה יש פונקציה אוטומטית במחלקה שנקראת כדי לטפל בפעולה הזו ואתה יכול להגדיר איזה מימוש שאתה רוצה לפונקציות אוטומטיות אלה.
לגבי השוואה אם כתבתי x == y
אז מופעלת הפונקציה:
Item.__eq__(x, y)
כלומר self יהיה x ו other יהיה y.
- מה שהבנתי הוא ש
type
מברר מאיזה סוג הפרמטר (מס’ , מחרוזת וכד’) ואילוisinstance
בודק שני גורמים ומשווה האם הם מאותו סוג ומחזירTrue
אוFalse
. אך שניהם מדברים על בדיקת סוג הפרמטר. יש הבדל נוסף? מהותי יותר?
עוד רמז נסה את התוכנית הבאה ותראה מה כל שורה מדפיסה:
import numbers
if type(7) == numbers.Number: print "type"
if isinstance(7, numbers.Number): print "isinstance"
אוקיי,
אם הבנתי נכון אז type
בודק את סוג הפרמטר ולכן לא מדפיס כלום (כי numbers.Number
הוא מחרוזת)
אבל isinstance
בודק האם 7 הוא מספר ולכן התנאי מתקיים. (קצת מזכיר לי את הפונקציה isdigit
)
אבל אם כך לא מובן לי איך יהיה מצב שהפונקציה הבאה לא תעבוד:
def __eq__(self,other):
if type(other) == type(self):
return self.x == other.x and self.y == other.y
אם type
בודקת רק את הסוג אז התנאי תמיד מתקיים…
מה אני מפספס כאן?
לא מדויק. נסה לקרוא את זה ותראה אם זה עוזר: