קורס Python שיעור תרגול תחביר מחלקות


זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/classes-syntax-lab
תרגיל 1 - למה זה לא נכון
"""
Answer 28-1
"""
class Summer():
    def __init__(self):
        self.total = 0

    def add(self,num):
        return self.total += num




s = Summer()
t = Summer()

s.add(10, 20)
t.add(50)
s.add(30)

# should print 60
print s.total()

# should print 50
print t.total()
תרגיל 2
"""
Answer 28-2
"""

class MyCounter():
    count=0

    @classmethod
    def __init__(cls):
        MyCounter.count +=1

for _ in range(10):
     c1 = MyCounter()

# should print 10
print MyCounter.count
לייק 1
תרגיל 3 - למה זה לא עובד

"""
Answer 28-3
"""
class Widget():

    def __init__(self,text):
        self.dependency=[]
        self.dependency.append(text)

    def add_dependency(self,*args):
        self.dependency = [w.dependency for w in args] + self.dependency

    def build(self):
        self.dependency = set(self.dependency)
        print self.dependency


luke    = Widget("Luke")
hansolo = Widget("Han Solo")
leia    = Widget("Leia")
yoda    = Widget("Yoda")
padme   = Widget("Padme Amidala")
anakin  = Widget("Anakin Skywalker")
obi     = Widget("Obi-Wan")
darth   = Widget("Darth Vader")
_all    = Widget("All")


luke.add_dependency(hansolo, leia, yoda)
leia.add_dependency(padme, anakin)
obi.add_dependency(yoda)
darth.add_dependency(anakin)

_all.add_dependency(luke, hansolo, leia, yoda, padme, anakin, obi, darth)
_all.build()
# code should print: Han Solo, Padme Amidala, Anakin Skywalker, Leia, Yoda, Luke, Obi-Wan, Darth Vader
# (can print with newlines in between modules)

רגע אחד אחד-

בוא נתחיל עם הראשון: כשאני מנסה להפעיל אותו אני מקבל את הודעת השגיאה הבאה:

  File "aa.py", line 6
    return self.total += num
                       ^
SyntaxError: invalid syntax

הסיבה שאי אפשר לשלב return עם פעולת השמה. נסה להפריד בין השניים ותראה לאן זה מתקדם

"""
Answer 28-1
"""
class Summer():
    def __init__(self):
        self.total = 0

    def add(self,*args):
        self.total += sum([x for x in args])

s = Summer()
t = Summer()

s.add(10, 20)
t.add(50)
s.add(30)

# should print 60
print s.total()

# should print 50
print t.total()

מתקבלת שגיאה
TypeError: 'int' object is not callable
למה?

או יותר פשוט:

def add(self, *args):
  self.total += sum(args)
לייק 1

עשיתי את מה שאתה מציע - ועדיין מתקבלת שגיאה
TypeError: ‘float’ object is not callable

זו כבר בעיה אחרת- המשמעות של השגיאה היא שניסית להפעיל (כלומר לכתוב סוגריים עגולים אחרי משהו) משהו מסוג int או float. נסה למצוא איפה ולמה ולתקן

צודק הורדתי מהקוד למעלה את הסוגריים מהמשתנה total וזה עבד תודה

פתרון שלי לתרגיל 1:

class Summer(object):

    def __init__(self):
        self.array = []

    def add(self,*arr):
        for num in arr:
            self.array.append(num)

    def total(self):
        return sum([num for num in self.array])

    

s = Summer()
t = Summer()

s.add(10,23)
t.add(50)
s.add(30)

# should print 60
print s.total()

# should print 50
print t.total()

היי ינון,
האם את תרגיל 3 תוכל לנסות לנסח אותו מחדש, הוא לא היה לי ברור כלומר בהדפסה שהוא אמור לבצע

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

ואם כבר להוסיף למערך ממליץ לקרוא על הפונקציה extend שיכולה לחסוך לך חלק מהקוד:
https://www.tutorialspoint.com/python/list_extend.htm

ושאלה אחרונה - ב total למה צריך ליצור List Comprehension? האם אי אפשר לחשוב סכום ישירות על self.array ?

בתרגיל 3 קיבלת קוד עם חלק חסר (המחלקה Widget חסרה). עליך להשלים את מימוש המחלקה Widget כדי שהקוד יעבוד.

קוד המחלקה Widget צריך לספק שתי פונקציות: האחת add_dependency יוצרת תלות בין שני אלמנטים. השניה, build, צריכה לבנות את ה Widget. העניין שבשביל לבנות Widget יש לבנות קודם את כל ה Widgets האחרים שהוא תלוי בהם (וכשאני אומר כאן בניה אני מתכוון פשוט להדפסה).

דוגמא נוספת קצת יותר קצרה מהתרגיל תהיה משהו כזה:

a = Widget("A")
b = Widget("B")
c = Widget("C")

a.add_dependency(b)
c.add_dependency(a)

c.build()

הקוד צריך לבנות את c. בשביל זה הוא מסתכל באיזה דברים c תלוי ומגלה ש c תלוי רק ב a, אבל a בתורו תלוי ב b. לכן בשביל לבנות את c צריך לבנות קודם את a ובשביל לבנות את a צריך לבנות קודם את b. סדר בניה טוב יהיה:

b -> a -> c

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