Lập Trình Hướng Đối Tượng (OOP) Trong Python: Hướng Dẫn Nâng Cao
Sau khi đã hiểu các khái niệm cơ bản về Lập trình hướng đối tượng (OOP) trong Python, bây giờ chúng ta sẽ đi sâu hơn vào các kỹ thuật nâng cao như method overriding, đa kế thừa (multiple inheritance), property decorator, magic methods, và metaclass.
1. Method Overriding – Ghi Đè Phương Thức
Ghi đè phương thức (Method Overriding) cho phép lớp con thay đổi hành vi của phương thức đã được định nghĩa trong lớp cha.
Ví dụ:
class Animal:
def speak(self):
return "Tạo âm thanh"
class Dog(Animal):
def speak(self): # Ghi đè phương thức speak()
return "Gâu gâu"
class Cat(Animal):
def speak(self):
return "Meo meo"
dog = Dog()
cat = Cat()
print(dog.speak()) # Output: Gâu gâu
print(cat.speak()) # Output: Meo meo
💡 Lợi ích: Giúp tùy chỉnh hành vi của lớp con mà không thay đổi lớp cha.
2. Đa Kế Thừa (Multiple Inheritance)
Python hỗ trợ đa kế thừa, tức là một lớp có thể kế thừa từ nhiều lớp cha.
Ví dụ:
class A:
def show(self):
return "Lớp A"
class B:
def display(self):
return "Lớp B"
class C(A, B): # Kế thừa từ cả A và B
pass
c = C()
print(c.show()) # Output: Lớp A
print(c.display()) # Output: Lớp B
💡 Lưu ý: Đa kế thừa có thể gây xung đột phương thức, cần chú ý thứ tự kế thừa và sử dụng super() hợp lý.
3. Property Decorator – Biến Thuộc Tính Thành Phương Thức
Trong Python, @property giúp biến một phương thức thành thuộc tính.
Ví dụ:
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self): # Getter
return self._age
@age.setter
def age(self, new_age): # Setter
if new_age > 0:
self._age = new_age
else:
raise ValueError("Tuổi phải lớn hơn 0")
p = Person("Thảo", 22)
print(p.age) # Output: 22
p.age = 25
print(p.age) # Output: 25
💡 Lợi ích: Kiểm soát quyền truy cập vào biến và giúp code rõ ràng hơn.
4. Magic Methods – Các Phương Thức Đặc Biệt
Magic Methods (còn gọi là Dunder Methods) là các phương thức có dấu gạch dưới kép (__method__), giúp tùy chỉnh hành vi của đối tượng.
Ví dụ: __str__ và __repr__
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def __str__(self): # Dùng khi gọi print()
return f"Cuốn sách: {self.title} của {self.author}"
def __repr__(self): # Dùng khi hiển thị trong shell
return f"Book('{self.title}', '{self.author}')"
b = Book("Python OOP", "Thảo")
print(b) # Output: Cuốn sách: Python OOP của Thảo
Một số magic methods hữu ích khác:
__add__: Tùy chỉnh phép cộng (+)__len__: Tùy chỉnhlen()__eq__: Tùy chỉnh so sánh==
Ví dụ tùy chỉnh phép cộng:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
v1 = Vector(2, 3)
v2 = Vector(4, 5)
v3 = v1 + v2
print(v3.x, v3.y) # Output: 6 8
💡 Lợi ích: Giúp làm việc với đối tượng theo cách trực quan hơn.
5. Metaclass – Tạo Class Một Cách Linh Hoạt
Metaclass là “class của class”, dùng để kiểm soát cách một class được tạo ra.
Ví dụ:
class Meta(type):
def __new__(cls, name, bases, dct):
print(f"Tạo class {name}")
return super().__new__(cls, name, bases, dct)
class MyClass(metaclass=Meta):
pass
# Output: Tạo class MyClass
💡 Lợi ích: Giúp kiểm soát quy trình tạo class, thường dùng trong thư viện lớn.
6. Tổng Kết
Bài viết này đã giúp bạn tìm hiểu các khía cạnh nâng cao của lập trình hướng đối tượng trong Python:
✔️ Ghi đè phương thức (Method Overriding) để thay đổi hành vi lớp cha.
✔️ Đa kế thừa (Multiple Inheritance) giúp kế thừa từ nhiều lớp cha.
✔️ Property Decorator (@property) giúp kiểm soát truy cập biến.
✔️ Magic Methods (__str__, __add__, v.v.) giúp làm việc với đối tượng dễ dàng hơn.
✔️ Metaclass giúp tạo class một cách linh hoạt.
💡 Bạn có câu hỏi gì về OOP nâng cao? Hãy để lại bình luận bên dưới!