Introspection và Reflection trong Python là hai khái niệm quan trọng trong lập trình, giúp chúng ta có thể kiểm tra và thao tác với các đối tượng trong thời gian chạy. Python là một ngôn ngữ mạnh mẽ, cung cấp các công cụ hỗ trợ cho hai khái niệm này.

Introspection/Reflection là gì?

Introspection là khả năng của một chương trình kiểm tra kiểu hoặc thuộc tính của các đối tượng tại runtime. Chính là quá trình “tự kiểm soát” của chương trình.

Reflection là khả năng của một chương trình có thể thao tác với các đối tượng tại runtime, thay đổi hoặc truy cập các thuộc tính của đối tượng.

Python có hỗ trợ Introspection và Reflection không?

Python hỗ trợ mạnh mẽ cả introspection và reflection. Thông qua các hàm và module có sẵn như type()dir()getattr()setattr()hasattr() và module inspect, chúng ta có thể thực hiện introspection và reflection một cách dễ dàng.

Sử dụng Introspection trong Python

Hãy cùng xem xét một số ví dụ để hiểu rõ hơn về cách introspection hoạt động trong Python.

Sử dụng hàm type()

# Tạo bởi vnengineer
a = [1, 2, 3]
print(type(a))  # Kết quả: 

Ở ví dụ trên, chúng ta sử dụng hàm type() để kiểm tra kiểu của đối tượng a.

Sử dụng hàm dir()

# Tạo bởi vnengineer
print(dir(a))

Hàm dir() trả về danh sách các thuộc tính và phương thức của đối tượng a.

Sử dụng hàm getattr()

# Tạo bởi vnengineer
class MyClass:
    def __init__(self):
        self.name = "Python"

obj = MyClass()
print(getattr(obj, 'name'))  # Kết quả: Python

Hàm getattr() cho phép chúng ta truy cập thuộc tính của đối tượng obj dựa trên tên.

Sử dụng Reflection trong Python

Reflection cho phép chúng ta thao tác và thay đổi các thuộc tính hoặc phương thức của đối tượng trong thời gian chạy.

Sử dụng hàm setattr()

# Tạo bởi vnengineer
setattr(obj, 'name', 'Python Programming')
print(obj.name)  # Kết quả: Python Programming

Hàm setattr() giúp chúng ta thay đổi giá trị của thuộc tính name của đối tượng obj.

Sử dụng hàm hasattr()

# Tạo bởi vnengineer
print(hasattr(obj, 'name'))  # Kết quả: True

Hàm hasattr() kiểm tra xem đối tượng obj có thuộc tính name hay không.

Sử dụng module inspect

# Tạo bởi vnengineer
import inspect

print(inspect.getmembers(obj))

Module inspect cung cấp nhiều hàm mạnh mẽ để tương tác với đối tượng. Hàm inspect.getmembers() trả về danh sách các thành viên của đối tượng obj.

Kết luận

Thông qua các ví dụ và giải thích ở trên, chúng ta có thể thấy rằng Python hỗ trợ rất tốt cho introspection và reflection. Các công cụ và hàm có sẵn giúp dễ dàng khám phá và thao tác với các đối tượng trong quá trình runtime. Điều này làm cho Python trở thành một ngôn ngữ mạnh mẽ và linh hoạt cho cả phát triển ứng dụng và dịch vụ.