เริ่มต้นใช้งานเริ่มต้นใช้งานได้ฟรี

การ Overload ตัวดำเนินการเปรียบเทียบ

เมื่อเปรียบเทียบออบเจกต์สองตัวของคลาสที่กำหนดเองด้วย == Python จะเปรียบเทียบแค่การอ้างอิงออบเจกต์ ไม่ใช่ข้อมูลที่เก็บอยู่ภายใน หากต้องการเปลี่ยนพฤติกรรมนี้ คลาสสามารถกำหนดเมธอดพิเศษ __eq__() ได้ โดยเมธอดนี้รับอาร์กิวเมนต์ 2 ตัว ซึ่งก็คือออบเจกต์ที่จะนำมาเปรียบเทียบ แล้วคืนค่า True หรือ False เมธอดนี้จะถูกเรียกใช้โดยอัตโนมัติเมื่อมีการเปรียบเทียบออบเจกต์สองตัว

คลาส BankAccount จากบทที่แล้วมีให้แล้วในแผงสคริปต์ โดยมีแอตทริบิวต์หนึ่งตัวคือ balance และเมธอด withdraw() บัญชีธนาคารสองบัญชีที่มียอดเงินเท่ากันไม่ได้หมายความว่าเป็นบัญชีเดียวกัน แต่โดยทั่วไปบัญชีธนาคารจะมี หมายเลขบัญชี และบัญชีสองบัญชีที่มีหมายเลขบัญชีเดียวกันควรถือว่าเป็นบัญชีเดียวกัน

แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร

การเขียนโปรแกรมเชิงวัตถุใน Python

ดูคอร์ส

คำแนะนำการฝึกหัด

ลองเลือกโค้ดในบรรทัดที่ 1-7 แล้วกดปุ่ม "Run code" จากนั้นลองสร้างออบเจกต์ BankAccount สักสองสามตัวในคอนโซลแล้วเปรียบเทียบกัน

  • แก้ไขเมธอด __init__() ให้รับพารามิเตอร์ใหม่ชื่อ number และกำหนดแอตทริบิวต์ number ใหม่
  • กำหนดเมธอด __eq__() ที่คืนค่า True เมื่อแอตทริบิวต์ number ของออบเจกต์ทั้งสองมีค่าเท่ากัน
  • ตรวจสอบคำสั่ง print และผลลัพธ์ในคอนโซล

แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ

ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์

class BankAccount:
   # MODIFY to initialize a number attribute
    def __init__(self, balance=0):
        self.balance = balance
      
    def withdraw(self, amount):
        self.balance -= amount 
    
    # Define __eq__ that returns True if the number attributes are equal 
    def ____(____, ____):
        return ____.number == ____.____   

# Create accounts and compare them       
acct1 = BankAccount(123, 1000)
acct2 = BankAccount(123, 1000)
acct3 = BankAccount(456, 1000)
print(acct1 == acct2)
print(acct1 == acct3)
    
แก้ไขและรันโค้ด