פונקציית הקסם str

שלום
יש לי שאלה:
נניח יש לי מחלקה ואני רוצה להדפיס ממנה
אז אני בונה לה פונקציית קסם str ואז מהתוכנה הראשית אני כותב את הפקודה פרינט ולמעשה מודפס לי מה שרשמתי ב str.
אבל אם אני רוצה שכל פעם יודפס לי חלק אחר של המחלקה? איך עושים את זה?
האם יש כזה דבר פונקציות קסם str1 str2 str3??

דריסה של str מאפשרת לך להגדיר את הייצוג המחרוזתי של המחלקה שלך. זה בא לידי ביטוי בעיקר כשתעשה
print על אובייקט שיצרת מהמחלקה. אז לשאלתך - בדריסת str אתה צריך להחליט על ייצוג אחד שאתה רוצה שהוא זה שיופיע בעת הפעלת str על האובייקט. באותו מימוש אתה יכול להכניס גם את הערכים של התכונות כמובן, בצורה שתהיה נוחה לקריאה.

לא מוכר לי משהו בסגנון של str2, str3 ואני לא בטוח שהבנתי בדיוק למה הכוונה שלך בזה, אבל זה בטח משהו שאפשר לבדוק עם קצת גוגל. מקווה שזה עזר, אם לא, אולי תוכל לתת דוגמא קונקרטית למה בדיוק היית רוצה לעשות עם מחלקה כלשהי? (נגיד תקרא לה A, לא משהו מהתרגילים כמובן).

לייק 1

והנה הדוגמא: זורם איתך
Class A:
Def init(self):
Self.a = 1
self.b = 2

 Def _str_():
  return f'value a is {self.a}, value b is {self.b}'

עכשיו במהלך ריצת התוכנית
אני רוצה שלפעמים יודפס לי רק שדה אחד
לפעמים רק השדה השני
ולפעמים שניהם יחד
כמו בפונקציית הסטר שבניתי פה

תוכל להדגים שימוש כזה, ואת הפלט הרצוי בהערה? כלומר, אני מניח שאתה לא מצפה למשהו כזה:

a = A()
print(a)
# prints: value of a is 1

ואז בפעם הבאה שתעשה את אותו דבר:

print(a)
# prints: value of b is 2

האם זה מה שהיית רוצה שהפונקציית str שלך תעשה?
בכל אופן אתה תמיד יכול ליצור פונקציות שידפיסו מה שבא לך ולקרוא להן איך שאתה רוצה. נגיד במקרה הזה אם תוסיף ל A:

def print_b(self):
    print(f"value of b is {self.b}")

ואז:

a.print_b()
# prints: value of b is 2

מעבר לזה לגמרי יתכן שיש דברים שאני לא יודע עליהם שקשורים למתודות קסם וספציפית ל str ושווה לחפש קצת באינטרנט, ולשתף אם תמצא משהו מגניב :slight_smile:

לייק 1

תיקון לקוד שלך…
a.print_b()

טוב
הבנתי
תודה רבה
20 תווים

לייק 1

תודה, אערוך :slight_smile: (כתבתי הכל כאן בתגובה בלי לנסות לכתוב או להריץ בעורך כלשהו לפני כן)

לייק 1

יש גם repr
אתה יכול ש-str תכלול if.

לייק 1

לגבי repr אני מכיר את זה כמשהו שעוזר להדפיס רשימות בצורה יפה. מעניין אם זה באמת יכול לעזור גם במשהו כמו זה שאייל שאל עליו. לגבי ה if, באמת רעיון טוב שכנראה הכי מתאים למה שאייל התכוון בשאלה שלו. אז אם להמשיך את הקוד ממקודם, אפשר למשל לעשות כך:

  • ערכתי מאז ההעלאה הראשונה של התגובה.
class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __str__(self):
        if self.a > 1:
            return f"value of a is {self.a}"
        elif self.b > 1:
             return f"value of b is {self.b}"
        else:
            return f"value of a is {self.a} and value of b is {self.b}"

    def __repr__(self):
        return str(self)

a1 = A(1, 2)
a2 = A(2, 1)
a3 = A(1, 1)
lst = [a1, a2, a3]
print(lst)
# prints: [value of b is 2, value of a is 2, value of a is 1 and value of b is 1]

print()
for item in lst:
    print(item)
# prints:
# value of b is 2
# value of a is 2
# value of a is 1 and value of b is 1
לייק 1

התנאי if נראה לי כמו אחלה פתרון.

לגבי repr הבנתי שלא כדאי להשתמש בזה להדפסות למשתמש (זה רק נועד ככלי עזר לכותב הקוד ?)

3 לייקים

אם כבר עלה, אז שאלת המשך (לא עלה בשום תרגיל ספציפי אצלי - זו שאלה תיאורטית):

האם אני יכולה לדעת מי קרא ל__str__ ?
(או כל פונקציה אחרת לצורך העיניין)
כלומר להכניס תנאי if שדורש לדעת מאיפה הגיעה הקריאה ולבצע בהתאם?
(אני גם יכולה לדמיין סיבות לא לעשות את זה,
או פתרונות שלא דורשים לדעת את זה - כמו פרמטר נוסף תו’כ הקריאה,
אבל באופן כללי האם המידע קיים איפשהוא שאפשר להביא אותו משם?)

תשתדלי ממש לא לעשות את זה, זה בעייתי ממש ויתנקם בך אח"כ. אם את חייבת יש את מודול inspect

2 לייקים