Menu
CoddyTech

Giới thiệu về phương thức ma thuật

Thuộc phần Lập trình hướng đối tượng trong hành trình Python của Coddy. Bài học 33 trên 64.

Phương thức ma thuật (còn gọi là phương thức dunder) là những phương thức đặc biệt có hai dấu gạch dưới ở đầu và cuối. Python tự động gọi chúng để đáp ứng một số thao tác nhất định.

Đây là ví dụ về một lớp có các phương thức đặc biệt:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"

Phương thức __init__ được gọi tự động khi bạn tạo một đối tượng:

my_book = Book("Python Programming", "John Smith", 350)

Phương thức __str__ được gọi tự động khi bạn chuyển đối tượng thành chuỗi:

print(my_book)        # Tự động gọi __str__
print(str(my_book))   # Cũng gọi __str__

Đầu ra:

Python Programming by John Smith
Python Programming by John Smith

Nếu không có __str__, khi in ra, bạn sẽ thấy địa chỉ bộ nhớ của đối tượng:

class SimpleBook:
    def __init__(self, title):
        self.title = title

simple = SimpleBook("Test Book")
print(simple)  # <__main__.SimpleBook object at 0x...>

Thêm một phương thức đặc biệt nữa để lấy độ dài:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book))   # Tự động gọi __len__

Đầu ra:

350

Điểm chính: Các phương thức đặc biệt bắt đầu và kết thúc bằng hai dấu gạch dưới (__method__) và được Python tự động gọi. Chúng giúp các đối tượng của bạn hoạt động với những hàm dựng sẵn như str(), len() và các toán tử, khiến lớp của bạn mang phong cách Python hơn và trực quan hơn khi sử dụng.

challenge icon

Thử thách

Dễ

Trong thử thách này, bạn sẽ triển khai lớp (class) Counter với các phương thức đặc biệt.

  • counter.py - Đây là tệp bạn cần chỉnh sửa, trong đó có các chú thích TODO hướng dẫn bạn triển khai
  • driver.py - Chứa nhiều test case

Triển khai lớp Counter trong counter.py và các test case trong driver.py theo hướng dẫn trong các chú thích TODO. Lớp này cần hỗ trợ khởi tạo với giá trị tùy chọn, biểu diễn dưới dạng chuỗi và các phép cộng.

Tự làm thử

# TODO: Nhập lớp Counter từ counter.py
# Dùng cú pháp: from counter import Counter

# Xử lý toàn diện các test case
test_case = input()

if test_case == "init_test":
    # TODO: Kiểm tra việc khởi tạo với giá trị mặc định
    # Tạo một bộ đếm không có đối số rồi in ra
    # Đầu ra mong đợi: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: Kiểm tra việc khởi tạo với một giá trị cụ thể
    # Tạo một bộ đếm có giá trị ban đầu là 10 rồi in ra
    # Lưu ý: print() ngầm gọi __str__, nhưng ở đây chúng ta tập trung kiểm tra __init__
    # Đầu ra mong đợi: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: Kiểm tra phép cộng
    # Tạo một bộ đếm có giá trị 3, cộng thêm 7 rồi in kết quả
    # Đầu ra mong đợi: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: Kiểm tra các phép cộng liên tiếp
    # Tạo một bộ đếm có giá trị 1, cộng thêm 2, rồi cộng thêm 3 vào kết quả và in ra
    # Đầu ra mong đợi: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: Kiểm tra với các giá trị âm
    # Tạo một bộ đếm có giá trị -5 và in ra
    # Sau đó cộng thêm -3 vào bộ đếm và in kết quả
    # Đầu ra mong đợi: "Count: -5" và "Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: Kiểm tra với giá trị 0
    # Tạo một bộ đếm có giá trị 0, cộng thêm 0 và in ra
    # Đầu ra mong đợi: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: Kiểm tra với các giá trị lớn
    # Tạo một bộ đếm có giá trị 1000000 và cộng thêm 9000000
    # Đầu ra mong đợi: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: Kiểm tra sự tương tác giữa nhiều bộ đếm
    # Tạo counter1 có giá trị 5 và counter2 có giá trị 10
    # In cả hai bộ đếm
    # Đầu ra mong đợi: "Count: 5" và "Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: Kiểm tra phép cộng với các kiểu dữ liệu khác nhau
    # Thử cộng một số thực (2.5) vào bộ đếm có giá trị 5
    # Đầu ra mong đợi: "Count: 7.5"
    pass
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Python online