4.1 Khởi tạo
Thông thường, ngay sau khi tạo, các đối tượng vẫn chưa sẵn sàng để làm việc. Đầu tiên, cần truyền tất cả dữ liệu cần thiết: thông số hoạt động, giá trị ban đầu, liên kết đến các đối tượng khác, v.v.
Quy trình này được gọi là khởi tạo và cần thực hiện ngay sau khi tạo đối tượng.
Giả sử bạn có một lớp Mèo (Cat)
, và bạn muốn đặt tên và tuổi cho nó, điều này có thể được thực hiện bằng nhiều cách khác nhau:
Khởi tạo thuộc tính sau khi tạo đối tượng
Trong ví dụ này, trước hết tạo:
- đối tượng trống
Cat
. - một thể hiện của lớp
Cat
có tên làbarsik
. - rồi đối tượng barsik được thiết lập hai thuộc tính:
name
vàage
được thêm trực tiếp vào đối tượng.
class Cat:
pass
# Tạo đối tượng Cat
barsik = Cat()
# Khởi tạo thuộc tính sau khi tạo đối tượng
barsik.name = "Barsik"
barsik.age = 5
print(f"Tên mèo: {barsik.name}, tuổi: {barsik.age}") # Xuất: Tên mèo: Barsik, tuổi: 5
Sử dụng phương thức để khởi tạo thuộc tính
Trong ví dụ này, phương thức initialize
được sử dụng để khởi tạo thuộc tính. Đối tượng Cat
được tạo mà không có thuộc tính nào, sau đó phương thức initialize()
được sử dụng để đặt các giá trị thuộc tính.
class Cat:
def initialize(self, name, age):
self.name = name
self.age = age
# Tạo đối tượng Cat
barsik = Cat()
# Khởi tạo thuộc tính qua phương thức
barsik.initialize("Barsik", 5)
print(f"Tên mèo: {barsik.name}, tuổi: {barsik.age}") # Xuất: Tên mèo: Barsik, tuổi: 5
Sử dụng trường lớp
Trong ví dụ này, các thuộc tính name
và age
được xác định ở mức lớp. Sau khi tạo đối tượng barsik
, các thuộc tính được khởi tạo trực tiếp.
class Cat:
name = ""
age = 0
# Tạo đối tượng Cat
barsik = Cat()
# Khởi tạo thuộc tính đối tượng
barsik.name = "Barsik"
barsik.age = 5
print(f"Tên mèo: {barsik.name}, tuổi: {barsik.age}") # Xuất: Tên mèo: Barsik, tuổi: 5
Cách nào tốt hơn? Chẳng cách nào! Tốt nhất là dùng constructor :)
4.2 Constructor
Constructor là phương thức đặc biệt, tự động
được gọi khi tạo đối tượng mới của lớp. Constructor được sử dụng để khởi tạo các trường của đối tượng và có thể thực hiện mọi hành động ban đầu cần thiết để cấu hình đối tượng.
Trong Python, constructor là phương thức có tên __init__
. Dưới đây là các đặc điểm chính của nó:
- Phương thức
__init__
là constructor trong Python. Nó được gọi tự động khi tạo một thể hiện mới của lớp. -
__init__
nhận ít nhất một tham số —self
, tham chiếu đến đối tượng được tạo. Ngoài ra, các tham số khác có thể được truyền để khởi tạo thuộc tính của đối tượng. - Trong phương thức
__init__
có thể đặt các giá trị ban đầu của các thuộc tính của đối tượng, sử dụngself
. - Constructor có thể thực hiện mọi hành động cần thiết để cấu hình đối tượng, chẳng hạn như kiểm tra dữ liệu đầu vào hoặc thiết lập liên kết với các đối tượng khác.
Các tham số được truyền cho constructor tự động, bạn chỉ cần chỉ định chúng trong dấu ngoặc tròn khi tạo đối tượng.
Đây là cách khởi tạo con mèo của chúng ta bằng constructor:
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
# Tạo đối tượng Cat với tên và tuổi
barsik = Cat("Barsik", 5)
print(f"Tên mèo: {barsik.name}, tuổi: {barsik.age}") # Xuất: Tên mèo: Barsik, tuổi: 5
Sau khi tạo đối tượng kiểu Cat
phương thức __init__
sẽ được gọi tự động, và ba tham số sẽ được truyền vào:
- Tham chiếu đến đối tượng barsik trong tham số
self
- Chuỗi «Barsik» trong tham số
name
- Số 5 trong tham số
age
Điều này tiện lợi và đẹp mắt.
Kiểm tra dữ liệu
Ngoài ra, trong constructor có thể thực hiện kiểm tra dữ liệu. Mục đích của constructor là tạo ra đối tượng hợp lệ (đúng) để có thể làm việc tiếp theo. Ví dụ:
class Cat:
def __init__(self, name, age):
if age < 0: raise ValueError("Tuổi không thể âm")
self.name = name
self.age = age
# Tạo đối tượng Cat với kiểm tra tuổi
try:
barsik = Cat("Barsik", -3)
except ValueError as e:
print(e) # Xuất: Tuổi không thể âm
GO TO FULL VERSION