Python - Phản quang

Xin chào các nhà thuật toán Python tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình thú vị vào thế giới phép màu của Python phản quang. Đừng lo lắng nếu bạn chưa từng nghe về phản quang trước đây - bằng cách kết thúc hướng dẫn này, bạn sẽ phản quang như một chuyên gia! Vậy hãy cầm chắc chiếc cây cơ (tôi muốn nói là bàn phím), và hãy bơi xuống với chúng tôi!

Python - Reflection

Phản quang là gì?

Trước khi bắt đầu, hãy hiểu rõ phản quang là gì. Trong lập trình, phản quang giống như là một chiếc gương cho phép một chương trình kiểm tra, tự nhìn và thay đổi cấu trúc và hành vi của chính nó vào lúc chạy. Đó như là bạn cho phép mã của mình nhìn vào chính nó và nói, "Hey, tôi được làm từ điều gì?" Rất thú vị, phải không?

Hàm type()

Hãy bắt đầu với hàm type(). Đó như là bạn hỏi một đối tượng, "Bạn là gì?"

# Ví dụ 1: Sử dụng type()
x = 5
y = "Chào"
z = [1, 2, 3]

print(type(x))  # Output: <class 'int'>
print(type(y))  # Output: <class 'str'>
print(type(z))  # Output: <class 'list'>

Trong ví dụ này, chúng ta đang hỏi các biến khác nhau là gì. Hàm type() nói với chúng ta rằng x là một số nguyên, y là một chuỗi và z là một danh sách. Đó giống như bạn đang có một cuộc trò chuyện với các biến của mình!

Hàm isinstance()

Tiếp theo là isinstance(). Hàm này như bạn hỏi, "Bạn có phải là một phần của gia đình này không?"

# Ví dụ 2: Sử dụng isinstance()
x = 5
y = "Chào"

print(isinstance(x, int))    # Output: True
print(isinstance(y, str))    # Output: True
print(isinstance(x, str))    # Output: False

Ở đây, chúng ta đang kiểm tra nếu x là một thể hiện của int (mà nó là), nếu y là một thể hiện của str (mà nó là) và nếu x là một thể hiện của str (mà nó không phải). Đó giống như bạn đang hỏi ai đó có phải là thành viên của một câu lạc bộ cụ thể không!

Hàm issubclass()

Chúng ta sẽ tiếp tục với issubclass(). Hàm này như bạn hỏi, "Bạn có phải là gia đình của gia đình này không?"

# Ví dụ 3: Sử dụng issubclass()
class Animal:
pass

class Dog(Animal):
pass

print(issubclass(Dog, Animal))  # Output: True
print(issubclass(Animal, Dog))  # Output: False

Trong ví dụ này, chúng ta đang kiểm tra nếu Dog là một lớp con của Animal (mà nó là) và nếu Animal là một lớp con của Dog (mà nó không phải). Đó giống như bạn đang hỏi liệu chó poodle có phải là một loại chó, so với việc bạn hỏi liệu tất cả các chó đều là poodle!

Hàm callable()

Bây giờ, hãy nói về callable(). Hàm này kiểm tra xem một đối tượng có thể gọi được hay không (như một hàm).

# Ví dụ 4: Sử dụng callable()
def greet():
print("Chào!")

x = 5

print(callable(greet))  # Output: True
print(callable(x))      # Output: False

Ở đây, chúng ta đang kiểm tra nếu greet (mà là một hàm) có thể gọi được hay không và nếu x (mà chỉ là một số) có thể gọi được hay không. Đó giống như bạn đang hỏi, "Tôi có thể sử dụng bạn như một hàm không?"

Hàm getattr()

getattr() như cách lịch sự hỏi một đối tượng cho một trong các thuộc tính của nó.

# Ví dụ 5: Sử dụng getattr()
class Person:
name = "Alice"
age = 30

p = Person()
print(getattr(p, "name"))  # Output: Alice
print(getattr(p, "job", "Unemployed"))  # Output: Unemployed

Trong ví dụ này, chúng ta đang yêu cầu đối tượng Person của chúng ta cho thuộc tính name (mà nó có). Chúng ta cũng đang yêu cầu một thuộc tính job (mà nó không có), vì vậy chúng ta cung cấp giá trị mặc định là "Unemployed".

Hàm setattr()

setattr() như đưa cho một đối tượng một thuộc tính mới hoặc thay đổi một thuộc tính hiện có.

# Ví dụ 6: Sử dụng setattr()
class Car:
color = "red"

my_car = Car()
print(my_car.color)  # Output: red

setattr(my_car, "color", "blue")
print(my_car.color)  # Output: blue

setattr(my_car, "brand", "Toyota")
print(my_car.brand)  # Output: Toyota

Ở đây, chúng ta đang thay đổi màu sắc của chiếc car của chúng ta từ đỏ sang xanh, và sau đó đưa cho nó một thuộc tính mới brand.

Hàm hasattr()

hasattr() như hỏi một đối tượng, "Bạn có thuộc tính này không?"

# Ví dụ 7: Sử dụng hasattr()
class Book:
title = "Python for Beginners"
pages = 200

my_book = Book()
print(hasattr(my_book, "title"))   # Output: True
print(hasattr(my_book, "author"))  # Output: False

Trong ví dụ này, chúng ta đang kiểm tra xem đối tượng Book của chúng ta có thuộc tính title (mà nó có) và thuộc tính author (mà nó không có).

Hàm dir()

Cuối cùng, hãy nhìn vào dir(). Hàm này như hỏi một đối tượng, "Bạn có thể làm gì?"

# Ví dụ 8: Sử dụng dir()
class Dog:
def __init__(self, name):
self.name = name

def bark(self):
print("Woof!")

my_dog = Dog("Buddy")
print(dir(my_dog))

Điều này sẽ đầu ra danh sách tất cả các thuộc tính và phương thức của đối tượng Dog của chúng ta, bao gồm namebark, cũng như một số thuộc tính nội tại mà tất cả các đối tượng đều có.

Tóm tắt các hàm phản quang

Dưới đây là tóm tắt nhanh về tất cả các hàm phản quang mà chúng ta đã trình bày:

Hàm Mục đích
type() Trả về kiểu của một đối tượng
isinstance() Kiểm tra xem một đối tượng có phải là thể hiện của một lớp cụ thể
issubclass() Kiểm tra xem một lớp có phải là lớp con của một lớp khác
callable() Kiểm tra xem một đối tượng có thể gọi được (như một hàm)
getattr() Lấy giá trị của thuộc tính của một đối tượng
setattr() Đặt giá trị của thuộc tính của một đối tượng
hasattr() Kiểm tra xem một đối tượng có thuộc tính cụ thể
dir() Trả về danh sách các thuộc tính và phương thức của một đối tượng

Và đó là như vậy, các bạn! Bạn đã bước ra đầu tiên vào thế giới của Python phản quang. Hãy nhớ rằng những công cụ này như là việc bạn đang có cuộc trò chuyện với mã của mình. Chúng cho phép các chương trình của bạn kiểm tra chính mình và ra quyết định dựa trên những điều gì chúng tìm thấy. Đó là một tính năng mạnh mẽ có thể làm cho mã của bạn trở nên linh hoạt và động tính hơn.

Khi bạn tiếp tục hành trình với Python, bạn sẽ tìm thấy nhiều cách khác để sử dụng phản quang để tạo ra các chương trình thông minh và linh hoạt hơn. Hãy tiếp tục tập luyện, khám phá và quan trọng nhất, hãy luôn vui chơi với Python!

Credits: Image by storyset