זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/classes-syntax-lab
זה נושא דיון מלווה לערך המקורי ב- 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
תרגיל 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)
עשיתי את מה שאתה מציע - ועדיין מתקבלת שגיאה
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
אפשר לחשוב על זה כמו סדר פעולות לביצוע פרויקט מסוים. יש פעולות מסוימות שתמיד חייבות להתבצע לפני פעולות אחרות ואתה יודע את זה עליהן (למשל אתה יודע שצריך ללבוש את הגרביים לפני הנעליים). המטרה כאן היא לבנות תוכנית שיודעת לקבל אילוצים מסוג זה ולהדפיס איזשהו סדר שבו כן אפשר יהיה לבצע את כל הפעולות.