Menu
CoddyTech

Ghi đè phương thức

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 19 trên 64.

Ghi đè phương thức cho phép lớp con cung cấp cách triển khai riêng cho một phương thức đã có trong lớp cha.

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

class Animal:
    def __init__(self, name):
        self.name = name
    
    def make_sound(self):
        print("Some generic animal sound")
    
    def info(self):
        print(f"I am {self.name}")

Tạo một lớp con ghi đè một phương thức:

class Dog(Animal):
    def make_sound(self):
        print("Woof! Woof!")  # Ghi đè phương thức của lớp cha

Phương thức make_sound trong Dog thay thế phương thức cùng tên trong Animal, nhưng info vẫn được kế thừa nguyên vẹn.

Tạo các đối tượng và kiểm thử các phương thức:

animal = Animal("Generic Animal")
dog = Dog("Buddy")

Gọi phương thức đã ghi đè:

animal.make_sound()
dog.make_sound()

Gọi phương thức không bị ghi đè:

animal.info()
dog.info()

Đầu ra:

Some generic animal sound
Woof! Woof!
I am Generic Animal
I am Buddy

Bạn có thể ghi đè bất kỳ phương thức nào được kế thừa:

class Cat(Animal):
    def make_sound(self):
        print("Meow!")
    
    def info(self):
        print(f"I am {self.name}, a sneaky cat")

cat = Cat("Whiskers")
cat.make_sound()
cat.info()

Đầu ra:

Meow!
I am Whiskers, a sneaky cat

Điểm chính: Ghi đè phương thức cho phép các lớp con tùy chỉnh hành vi được kế thừa. Chỉ cần định nghĩa một phương thức có cùng tên trong lớp con. Phiên bản của lớp con sẽ được dùng thay cho phiên bản của lớp cha.

challenge icon

Thử thách

Trung bình

Trong thử thách này, bạn sẽ triển khai hệ thống phân cấp các hình.

  • shape.py - Chứa lớp cha Shape với thuộc tính color và các phương thức
  • circle.py - Chứa lớp Circle kế thừa từ Shape
  • square.py - Chứa lớp Square kế thừa từ Shape

Mỗi tệp có các chú thích TODO chi tiết, hướng dẫn bạn từng bước triển khai.

Tự làm thử

from shape import Shape
from circle import Circle
from square import Square

# Xử lý test case
test_case = input()

if test_case == "base_shape":
    # Kiểm tra lớp Shape cơ sở
    shape = Shape("green")
    print(f"Color: {shape.color}")
    print(f"Area: {shape.area()}")
    print("Describe output:")
    shape.describe()

elif test_case == "circle_basics":
    # Kiểm tra việc tạo Circle và các phương thức cơ bản
    circle = Circle("red", 5)
    print(f"Color: {circle.color}")
    print(f"Radius: {circle.radius}")
    print(f"Area (rounded): {round(circle.area(), 2)}")
    print("Describe output:")
    circle.describe()

elif test_case == "square_basics":
    # Kiểm tra việc tạo Square và các phương thức cơ bản
    square = Square("blue", 4)
    print(f"Color: {square.color}")
    print(f"Side length: {square.side_length}")
    print(f"Area: {square.area()}")
    print("Describe output:")
    square.describe()

elif test_case == "various_sizes":
    # Kiểm tra nhiều instance có kích thước khác nhau
    shapes = [
        Circle("yellow", 2),
        Circle("orange", 7.5),
        Square("purple", 3),
        Square("black", 10)
    ]
    
    for i, shape in enumerate(shapes, 1):
        print(f"Shape {i}:")
        shape.describe()
        print(f"Area: {round(shape.area(), 2)}")
        print()  # Dòng trống giúp dễ đọc

elif test_case == "shape_polymorphism":
    # Kiểm tra tính đa hình với danh sách các hình
    shapes = [
        Shape("white"),
        Circle("red", 3),
        Square("blue", 4)
    ]
    
    print("Polymorphic behavior demonstration:")
    for shape in shapes:
        shape.describe()
        print(f"Area: {round(shape.area(shape_polymorphism), 2)}")
        print()  # Dòng trống giúp dễ đọc

elif test_case == "original_test_case":
    # Chạy đoạn code kiểm thử ban đầu của thử thách
    circle = Circle("red", 5)
    square = Square("blue", 4)

    # Kiểm tra phương thức describe
    circle.describe()
    square.describe()

    # Kiểm tra phương thức area
    print(f"Circle area: {circle.area()}")
    print(f"Square area: {square.area()}")
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