Python: Hàm tạo (Constructor)

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Tổng quan

Mỗi lớp có thể chứa nhiều biến trong đó việc khai báo và khởi tạo sẽ trở nên khó khăn để theo dõi nếu chúng được thực hiện bên trong các khối khác nhau. Tương tự như vậy, có thể có những hoạt động khởi đầu khác mà cần được giải quyết trong một ứng dụng, chẳng hạn như mở một tập tin. Python cho phép các đối tượng khởi tạo chính bản thân chúng một cách trực tiếp ngay trong quá trình tạo chúng. Điều này được được thực hiện bằng cách định nghĩa các hàm tạo (constructor) trong lớp.

Mỗi hàm tạo là một phương thức có tên __init__. Hàm tạo có nhiệm vụ khởi tạo giá trị cho các thuộc tính hoặc thực hiện các hoạt động khởi tạo chỉ một lần trong khi tạo một đối tượng của lớp. Các hàm tạo sẽ tự động được gọi và thực thi mỗi khi một đối tượng được tạo và gọi đến hàm tạo đó.

Chú ý: Bạn cũng có quyền áp dụng hình thức tải chồng phương thức đối với hàm tạo.

Có hai loại hàm tạo chính như sau:

1. Hàm tạo không tham số

Cú pháp khai báo hàm tạo không tham số của một lớp là như sau:

__init__() {
  //Các câu lệnh khởi tạo
}

Ví dụ dưới đây định nghĩa một lớp có tên là Animal có một hàm tạo không tham số.

#tạo lớp Animal:
class Animal:
  #khai báo các thuộc tính trong hàm tạo luôn:
  def __init__(self):
    self.id=1234 #mã nhận diện
    self.name="Moon" #tên
    self.age=1 #tuổi

Trong đoạn mã có định nghĩa một phương thức có tên __init__() và đây chính là hàm tạo. Phương thức này sẽ khai báo và đồng thời khởi tạo giá trị cho các thuộc tính id, name và age khi đối tượng của lớp được tạo. Hàm tạo này không có bất kỳ tham số nào, vì thế nó được gọi là hàm tạo không tham số.

Lời gọi tới hàm tạo

Hàm tạo được gọi trực tiếp trong quá trình tạo đối tượng. Ví dụ:

cat = new Animal() //gọi tới hàm tạo không tham số

Lệnh trên tạo một đối tượng có tên cat. Trước tiên đối tượng của lớp Animal sẽ được cấp phát vùng nhớ và sau đó hàm tạo không tham số __init__() được gọi. Vì thế hàm tạo không tham số này (như đã được định nghĩa ở ví dụ phía trên) sẽ khởi tạo giá trị cho các thuộc tính của đối tượng cat là id, name và age.

Dưới đây là ví dụ hoàn chỉnh, bạn có thể copy code và chạy thử:

#tạo lớp Animal:
class Animal:
  #khai báo các thuộc tính trong hàm tạo luôn:
  def __init__(self):
  self.id=1234 #mã nhận diện
  self.name="Moon" #tên
  self.age=1 #tuổi

cat = Animal()
print("ID:",cat.id)
print("Name:",cat.name)
print("Age:",cat.age)

Kết quả:

ID: 1234
Name: Moon
Age: 1

Hàm tạo mặc định

Trong trường hợp bạn không định nghĩa hàm tạo nào trong lớp, hàm tạo mặc định (được trình dịch cung cấp) sẽ được gọi để khởi tạo các đối tượng. Hàm tạo mặc định này không có tham số và nó sẽ khởi tạo giá trị cho các thuộc tính của đối tượng mới.

Ví dụ sau định nghĩa lớp có tên NhanVien nhưng không định nghĩa hàm tạo nào.

class NhanVien:
  #khai báo các thuộc tính
  tenNhanVien="Phương"
  tuoiNhanVien=20
  luongNhanVien=15000000
  tinhTrangHonNhan=False

  #phương thức để hiển thị thông tin chi tiết nhân viên
  def chiTietNhanVien(self):
    print("Chi tiết nhân viên:")
    print("================")
    print("Tên:",self.tenNhanVien)
    print("Tuổi:",self.tuoiNhanVien)
    print("Lương:",self.luongNhanVien)
    print("Tình trạng hôn nhân:",self.tinhTrangHonNhan)

Ví dụ trên khai báo một lớp NhanVien với các thuộc và một phương thức là chiTietNhanVien(). Phương thức này in giá trị của các thuộc tính ra màn hình.

Ví dụ sau đây tạo một đối tượng của lớp NhanVien ở trên và từ đó gọi phương thức chiTietNhanVien() của nó.

#tạo đối tượng mới của lớp NhanVien:
objNV = NhanVien()
objNV.chiTietNhanVien()

Vì lớp NhanVien không có bất kỳ hàm tạo nào được định nghĩa, nên hàm tạo mặc định sẽ được tạo khi thực thi chương trình.

Sau đó, đối tượng objNV sẽ được tạo và nó thực thi phương thức chiTietNhanVien() để hiển thị các giá trị của các biến thể hiện của đối tượng objNV.

Dưới đây là đoạn code hoàn chỉnh, bạn có thể copy và chạy thử nghiệm:

class NhanVien:
  #khai báo các thuộc tính
  tenNhanVien="Phương"
  tuoiNhanVien=20
  luongNhanVien=15000000
  tinhTrangHonNhan=False

  #phương thức để hiển thị thông tin chi tiết nhân viên
  def chiTietNhanVien(self):
    print("Chi tiết nhân viên:")
    print("================")
    print("Tên:",self.tenNhanVien)
    print("Tuổi:",self.tuoiNhanVien)
    print("Lương:",self.luongNhanVien)
    print("Tình trạng hôn nhân:",self.tinhTrangHonNhan)

#tạo đối tượng mới của lớp NhanVien:
objNV = NhanVien()
objNV.chiTietNhanVien()

Kết quả:

Chi tiết nhân viên:
================
Tên: Phương
Tuổi: 20
Lương: 15000000
Tình trạng hôn nhân: False

2. Hàm tạo có tham số

Trong ví dụ bên trên có định nghĩa hàm tạo không tham số cho lớp Animal, trong đó gán giá trị 1234 cho thuộc tính id, "Moon" cho thuộc tính name, và 1 cho thuộc tính age. Và điều này cũng có nghĩa là tất cả các đối tượng của lớp Animal đều sẽ được khởi tạo các giá trị giống nhau cho các thuộc tính khi hàm tạo không tham số được gọi. Điều này không hữu dụng trong nhiều tình huống.

Để khắc phục điều này ta có thể định nghĩa hàm tạo chứa một danh sách các tham số với mục đích khởi tạo giá trị cho các thuộc tính của đối tượng tương ứng. Các giá trị khởi tạo sẽ được truyền cho hàm tạo tương ứng được gọi trong quá trình tạo đối tượng.

Ví dụ sau đây sẽ định nghĩa thêm hàm tạo ba tham số cho lớp Animal:

#tạo lớp Animal:
class Animal:
  #khai báo các thuộc tính trong hàm tạo 3 tham số:
  def __init__(self,id,name,age):
    self.id=id #mã nhận diện
    self.name=name #tên
    self.age=age #tuổi

  def showInfo(self):
    print("ID:",self.id)
    print("Name:",self.name)
    print("Age:",self.age)

#tạo 1 đối tượng mới
dog = Animal(5678,"Chó phú quốc", 1.5)
dog.showInfo()

Kết quả:

ID: 5678
Name: Chó phú quốc
Age: 1.5

Ví dụ trên khai báo một hàm tạo ba tham số là __init__(id,name,age). Trong quá trình thực thi, hàm tạo sẽ chấp nhận giá trị của ba tham số và gán chúng cho các thuộc tính id, name, và age của đối tượng được tạo.

Trong quá trình tạo đối tượng dog, những điều sau đây xảy ra theo trình tự:

  1. Việc cấp phát bộ nhớ được thực hiện cho đối tượng mới của lớp.
  2. Các giá trị 5678, "Phú Quốc", và 1.5 được truyền tới hàm tạo ba tham số là __init__(id,name,age) trong đó khởi tạo giá trị cho các thuộc tính của đối tượng là id, name, và age.
  3. Cuối cùng, tham chiếu của đối tượng mới được tạo được trả về và lưu trong biến tham chiếu dog.

Xem thêm:

» Tiếp: Từ khóa self
« Trước: Truy cập các thuộc tính và phương thức của đối tượng
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!