12: Class & Object

12-5: Magic Method

** ถ้าใช้งานบนมือถือหรือ tablet แนะนำให้ใช้ Chrome หรือ Safari เท่านั้น **

แบบฝึกหัด 12-5 ข้อที่ 1

code ข้างล่างนี้มีคลาส Rational เพื่อผลิตจำนวนตรรกยะ คือ จำนวนที่เขียนในรูปของ เศษ/ส่วน โดยที่เศษ (numerator) และส่วน (denominator) เป็นจำนวนเต็ม จงเขียนเมท็อด __str__ ที่คืนสตริงที่นำเศษกับส่วนมาประกอบกันโดยมีเครื่องหมาย / คั่น และอาจมีเครื่องหมายลบ - นำหน้า ถ้าเป็นจำนวนลบ (เช่น str(Rational(-2,-4)), str(Rational(2,-4))) ได้ 2/4 กับ -2/4 ตามลำดับ)

___inp___ = ["7 9"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t class Rational: def __init__(self, n, d): self.n = n self.d = d def __str__(self): #---------------------------------- # ไม่ต้องแก้ไขคำสั่งใด ๆ ข้างล่างนี้ n, d = [int(e) for e in input().split()] r = Rational(n, d) s = str(r) class Rational: def __init__(self, n, d): self.n = n self.d = d def __str__(self): s = str(abs(self.n)) + "/" + str(abs(self.d)) if self.n/self.d < 0: s = "-" + s return s n, d = [int(e) for e in input().split()] r = Rational(n, d) s = str(r) vars = ["7 9", "-7 -9", "-7 9", "7 -9"] msgs = ["เป็นบวกทั้งคู่", "เป็นลบทั้งคู่", "มีหนึ่งตัวติดลบ", "มีหนึ่งตัวติดลบ"] for v,msg in zip(vars, msgs): Ex().has_equal_value(pre_code = "___inp___[0] = '" + v + "'", name = "s", undefined_msg = "ไม่พบสตริง s", incorrect_msg = "สตริง s มีค่าไม่ถูกต้อง กรณีเศษและส่วน" + msg)
แบบฝึกหัด 12-5 ข้อที่ 2

code ข้างล่างนี้มีคลาส Rational เพื่อผลิตจำนวนตรรกยะ คือ จำนวนที่เขียนในรูปของ เศษ/ส่วน โดยที่เศษ (numerator) และส่วน (denominator) เป็นจำนวนเต็ม จงเขียนเมท็อด __lt__(self, x) ที่คืนผลการเปรียบเทียบว่า self น้อยกว่า x หรือไม่ (โดยใช้ค่าของจำนวนตรรกยะของทั้งสองในการเปรียบเทียบ)

___inp___ = ["None"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t def check_Rational(): r = [Rational(3, 2), Rational(2,7), Rational(-3, 4), Rational(3, -4)] for i in range(len(r)): for j in range(len(r)): print(r[i] < r[j]) class Rational: def __init__(self, n, d): self.n = n self.d = d def __lt__(self, x): #---------------------------- exec(input()) # ไม่แก้ไขคำสั่งนี้ class Rational: def __init__(self, n, d): self.n = n self.d = d def __lt__(self, x): return self.n/self.d < x.n/x.d #---------------------------- exec(input()) # ไม่แก้ไขคำสั่งนี้ Ex().has_equal_output(pre_code = "___inp___[0] = 'check_Rational()'", incorrect_msg = "ยังเปรียบเทียบใน __lt__ ไม่ถูกต้อง")
แบบฝึกหัด 12-5 ข้อที่ 3

code ข้างล่างนี้มีคลาส Time เพื่อผลิตอ็อบเจกต์เวลา ภายในเก็บเลขชั่วโมง นาที และวินาที จงเขียนเมท็อดเพิ่มในคลาสนี้ เพื่อให้คำสั่ง t.sort() สามารถเรียงลำดับเวลาที่เก็บในลิสต์ t ได้ถูกต้องจากเวลาน้อยไปมาก (เวลาน้อยกว่าคือเวลาที่มาก่อน)

___inp___ = ["None"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t def check_Time(): t = [Time(9,5,30), Time(10,0,0), Time(9,5,29), Time(9,5,30), Time(9,6,10), Time(1,2,3)] t.sort() for e in t: print(e) class Time: def __init__(self, h, m, s): self.h = h self.m = m self.s = s def __str__(self): return ("0"+str(self.h))[-2:]+":" + \ ("0"+str(self.m))[-2:]+":" + \ ("0"+str(self.s))[-2:] #---------------------------- exec(input()) # ไม่แก้ไขคำสั่งนี้ class Time: def __init__(self, h, m, s): self.h = h self.m = m self.s = s def __str__(self): return ("0"+str(self.h))[-2:]+":" + \ ("0"+str(self.m))[-2:]+":" + \ ("0"+str(self.s))[-2:] def __lt__(self, rhs): t1 = (self.h, self.m, self.s) t2 = (rhs.h, rhs.m, rhs.s) return t1 < t2 #---------------------------- exec(input()) # ไม่แก้ไขคำสั่งนี้ Ex().has_equal_output(pre_code = "___inp___[0] = 'check_Time()'", \ incorrect_msg = "ยังเปรียบเทียบเวลาใน __lt__ ไม่ถูกต้อง")
แบบฝึกหัด 12-5 ข้อที่ 4

code ข้างล่างนี้มีคลาส Item และ Order เพื่อผลิตอ็อบเจกต์รายการอาหารและการสั่งอาหารจากลูกค้า ภายใน Order มีตัวแปร order_items เป็นลิสต์เก็บรายการอาหาร ซึ่งเป็นอ็อบเจกต์ของ Item ที่ลูกค้าสั่ง เช่น ลูกค้าสั่งส้มตำสองจาน ก็จะมีอ็อบเจกต์ของส้มตำของอันในลิสต์นี้ นอกจากนี้มีตัวแปร paid เก็บสถานะว่า การสั่งอาหารนี้จ่ายเงินแล้วหรือยัง
จงเขียนเมท็อดเพิ่มใน Order เพื่อให้สามารถนำอ็อบเจกต์ไปเปรียบเทียบการสั่งอาหารได้ว่า การสั่งใดน้อยกว่าการสั่งใด โดยมีเกณฑ์การเปรียบเทียบดังนี้ การสั่งอาหารที่ยังไม่จ่ายถือว่าน้อยกว่าการสั่งอาหารที่จ่ายแล้ว (โดยไม่สนใจราคารวมของการสั่งอาหาร) หากสถานะการจ่ายอาหารเหมือนกัน ให้ใช้ราคารวมของรายอาหารทั้งหมดของการสั่งเป็นเกณฑ์การเปรียบเทียบ

___inp___ = ["None"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t def check_Order(): m = [Item("A", 10), Item("B", 15), Item("C", 18), Item("D", 20)] o1 = Order(); o2 = Order(); o3 = Order(); o4 = Order() o1.order_items = [m[0],m[1],m[0],m[2]] o2.order_items = o1.order_items o3.order_items = [m[1],m[1],m[2],m[2],m[0],m[3]] o4.order_items = o3.order_items o2.paid = o4.paid = True print(o1 < o2, o1 < o3, o1 < o4) print(o2 < o1, o2 < o3, o2 < o4) print(o3 < o1, o3 < o2, o3 < o4) print(o4 < o1, o4 < o2, o4 < o3) class Item: def __init__(self, name, price): self.name = name self.price = price class Order: def __init__(self): self.order_items = [] self.paid = False #---------------------------- exec(input()) # ไม่แก้ไขคำสั่งนี้ class Item: def __init__(self, name, price): self.name = name self.price = price class Order: def __init__(self): self.order_items = [] self.paid = False def total(self): return sum([item.price for item in self.order_items]) def __lt__(self, x): return (self.paid,self.total()) < (x.paid,x.total()) #---------------------------- exec(input()) # ไม่แก้ไขคำสั่งนี้ Ex().has_equal_output(pre_code = "___inp___[0] = 'check_Order()'", \ incorrect_msg = "ยังเปรียบเทียบไม่ถูกต้อง")