Hôm nay chúng ta nói về class (lớp). Không, không phải lớp học.
Trong lập trình, class có định nghĩa riêng. Class là bản thiết kế (blueprint) do lập trình viên tạo cho object (đối tượng). Nó định nghĩa dữ liệu lưu trong object và phương thức thực hiện trên object đó.
Python là ngôn ngữ lập trình hướng đối tượng (object-oriented). Nghĩa là dùng mẫu phát triển nơi object và class dùng lưu dữ liệu.
Cách tiếp cận hướng đối tượng giúp giảm lặp lại mã, làm cho mã dễ đọc và bảo trì hơn. Class và object là phần của nhiều ngôn ngữ, như Java, Python, C++.
Trong hướng dẫn này, chúng ta thảo luận class là gì, cách hoạt động, và cách khai báo trong Python. Chúng ta đi qua vài ví dụ giúp bạn.
Class Là Gì?
Class là bản thiết kế bạn dùng định nghĩa object.
Hãy tưởng tượng bạn nhìn bản thiết kế ngôi nhà. Bản thiết kế nêu rõ cửa đặt đâu, cửa sổ đặt đâu, v.v. Class trong lập trình tương tự. Class cung cấp bản thiết kế dữ liệu lưu trong object.
Class định nghĩa dùng từ khóa class. Hãy bắt đầu định nghĩa class Player với hai hàm:
class Player:
\"\"\" This is a class for a player \"\"\"
name = "Luke"
def wield_sword(self):
print("You have wielded your sword.")
def drink_health_potion(self):
print("You have consumed a health potion.")
Class này đại diện người chơi trong game. Chứa cả thuộc tính (attribute) và phương thức (method). Thuộc tính thường gọi biến instance (biến thể hiện) khi bên trong class.
Một phương thức cho phép cưỡi kiếm, phương thức kia cho phép uống bình máu. Class chứa một biến class: name. Lưu tên mặc định người chơi.
Lưu ý chúng ta dùng từ self vài lần. Self là đại diện của chính class. Self chứa tất cả giá trị lưu trong class cụ thể, để truy cập tất cả bên trong phương thức.
Khi chạy mã, không xảy ra gì. Điều gì xảy ra? Nhớ chúng ta nói class là bản thiết kế? Đó là lý do không xảy ra gì. Chúng ta phải làm gì đó với bản thiết kế để nó hữu ích.
Object Là Gì?
Object là một instance (thể hiện) đơn lẻ của class. Nó được định nghĩa dùng bản thiết kế class tạo ra.
Hãy tạo object cho người chơi mới trong game, Luke:
luke = Player()
Chúng ta vừa tạo object Luke. Object này giờ truy cập tất cả dữ liệu lưu trong class, và phương thức liên quan class:
luke = Player() print(luke.name) luke.wield_sword()
Mã trả về:
Luke
You have wielded your sword.
Trong mã, chúng ta in giá trị thuộc tính name trong object Luke. Để truy cập thuộc tính class, nêu tên class, dấu chấm, rồi thuộc tính instance bạn muốn truy cập. Thường gọi dot notation (ký pháp dấu chấm).
Mặc định, giá trị name đặt là Luke. Chúng ta nói cách thay đổi tra chút.
Chúng ta cũng gọi lớp wield_sword(). Khi gọi, nội dung phương thức wield_sword() trong class Player thực thi. Gây ra in thông báo "You have wielded your sword."
Bạn khai báo bao nhiêu object của class tùy thích: đó là lý do class mạnh mẽ. Bạn tái sử dụng cùng phương thức và giá trị mặc định lưu trong class qua nhiều object khác nhau.
Constructor Của Class
Constructor cho phép khởi tạo dữ liệu bên trong class. Phương thức constructor thực thi ngay sau khi khai báo object của class cụ thể.
Tên constructor là __init__(). Bạn có thể thấy hàm với gạch dưới kép (__). Hàm này gọi hàm đặc biệt vì có mục đích định sẵn. Ở đây, mục đích __init__ là khởi tạo class.
Cập nhật class Player trước để bao gồm phương thức này đầu class:
def __init__(self):
print("Your character has been created.")
Phương thức này phải đứng trước bất kỳ biến hoặc phương thức nào định nghĩa trong class. Chạy mã chính trước:
luke = Player() print(luke.name) luke.wield_sword()
Mã trả về:
Your character has been created.
Luke
You have wielded your sword.
Chúng ta không gọi __init__ trong chương trình chính nhưng nó chạy. Đó là vì constructor tự động thực thi khi tạo object của class.
Trước, chúng ta gán giá trị biến name trong class là Luke. Mặc dù hữu ích nếu muốn gọi người chơi Luke, không thực tế nếu người chơi tên khác.
Đó là lúc constructor xuất hiện. Hãy tạo constructor cho phép gán tên người chơi:
class Player:
def __init__(self, name):
self.name = name
Mã này cho phép truyền tham số vào mỗi object Player. Tham số đại diện tên người chơi. Chúng ta tạo phương thức cho biết tên người chơi:
class Player:
def __init__(self, name):
self.name = name
def get_name(self):
print("Your name is " + self.name)
Hãy tạo instance mới class Player cho người chơi Leah:
leah = Player("Leah")
leah.get_name()
Mã trả về:
Your name is Leah.
Chúng ta gán giá trị biến name trong object là Leah. Nghĩa là đâu tham chiếu trong class, giá trị là Leah. Constructor thực thi ngay khi tạo object class, nên không lo gọi nó.
Chúng ta gọi phương thức get_name() in tên liên quan người chơi.
Bạn thêm bao nhiêu tham số class tùy thích:
class Player:
def __init__(self, name, player_type):
self.name = name
self.player_type = player_type
def get_name(self):
print("Your name is " + self.name)
def get_player_type(self):
print(self.name + " is a " + self.player_type + ".")
Trong ví dụ này, class Player hỗ trợ hai tham số. Một đại diện tên Player (name) và kia đại diện loại player (player_type). Hãy tạo object lớp này:
leah = Player("Leah", "Mage")
leah.get_name()
leah.get_player_type()
Mã trả về:
Your name is Leah.
Leah is a Mage.
Cả hai giá trị khởi tạo đều truy cập được trong class.
Kết Luận
Class cho phép giảm lặp lại mã. Khi định nghĩa class, bạn dùng cấu trúc nó định nghĩa bao nhiêu object tùy thích. Kết quả giảm lặp lại, mã dễ đọc, do đó dễ bảo trì.
Bây giờ bạn đã sẵn sàng viết class Python riêng như chuyên gia!