Cùng lớp với đối tượng là các thành phần cốt lõi của Python. Lớp cung cấp một cách tổ chức các thuộc tính [dữ liệu] và phương thức [hành vi]. Một khái niệm vô cùng quan trọng của OOP[Lập trình hướng đối tượng] là kế thừa lớp [dịch đại ý là kế thừa lớp]. Kế thừa lớp cho phép chúng ta tạo ra một lớp "thừa kế" [kế thừa] mọi tính năng của một hoặc nhiều lớp cha, chỉnh sửa các tính năng đó và đồng thời bổ sung các phương thức, thuộc tính. Trong bài viết này, mình cùng các bạn khám phá khái niệm này trong Python
II, Cách mạng kế thừa một giai cấp
Cú pháp để kế thừa một lớp làm lớp cha như sau
class Parent: pass class Child[Parent]: pass
class Parent:
pass
class Child[Parent]:
pass
[Các] lớp cha được định nghĩa trong [] sau tên của lớp con
Để kiểm tra [các] lớp cha của một lớp Để kiểm tra [các] lớp cha của một lớp là gì, chúng ta sử dụng cú pháp. __cơ sở__. Câu lệnh sẽ trả về một tuple chứa [các] lớp cha của. Đối với lớp Con ở trên, cú pháp trên sẽ trả về
[object,]
Oh vậy đối tượng chính là cha mẹ của cha mẹ. Vì Python là ngôn ngữ OO[Hướng đối tượng] nên mọi thứ trong Python đều là đối tượng ngoại trừ luồng điều khiển. Và đối tượng là lớp cơ sở của mọi đối tượng trong Python. Một ví dụ để thấy điều này đó là
In [1]: int.__bases__ Out[1]: [object,]
III. Các cách mở rộng lớp thông qua kế thừa
Đây là lớp cha mà chúng ta sẽ sử dụng trong ba phần bên dưới
class Animal: def __init__[self, age, gender]: self.age = age self.gender = gender
1. Add new method[s]
class Dog[Animal]: def bark[self]: print["Woof Woof"] misa = Dog[1, 'gay'] misa.bark[]
Đầu ra sẽ là
Woof Woof
2. Định nghĩa lại, chỉnh sửa [các] phương thức có sẵn của [các] lớp cha
pass
0Đầu ra sẽ là
pass
13. Thêm [các] thuộc tính mới
pass
2Ý niệm super[] mình sẽ giải thích ở sau. Các bạn có thể hiểu super[] trong bối cảnh hiện tại là để gọi phiên bản trước — tức là class Animal. Ở ví dụ trên, đó là truyền vào init của lớp Animal hai thuộc tính đó là tuổi, giới tính như định nghĩa của nó
pass
3đầu ra
pass
4Như các bạn đã thấy polar_bar có đầy đủ hai thuộc tính của Animal đó là tuổi, giới tính và thuộc tính fur_color mới được thêm vào lớp Bear
IV. Quan hệ giữa các lớp con và lớp cha
Sự kiện "thừa kế" giữa lớp con và lớp cơ sở sẽ tạo ra một quan hệ "huyết hệ thống" giữa 2 lớp
Ví dụ kiểm tra loại instance của polar_bear
pass
5Do đó, một đoạn code hoạt động với thể hiện của lớp cha thì nên hoạt động với thể hiện của lớp con
V. Kết luận
Trong phần này, mình đã giới thiệu các tính chất cơ bản của lớp - một tính năng cốt lõi của Python. Mong bài viết này có thể giúp bạn bổ sung kiến thức và ứng dụng được vào công việc. Ở phần sau, mình sẽ nói về những tính năng nâng cao hơn của class mà không phải Python developer lâu năm nào nắm cũng biết. Rất mong nhận được sự đón nhận của các bạn
Kế thừa [Inheritance] trong lập trình hướng đối tượng Python là việc cho phép một lớp [hay lớp] sử dụng lại các thuộc tính và phương thức từ các lớp khác nhau đã được định nghĩa. Các lớp con trong Python sẽ khai báo việc kế thừa một lớp cha ngay trong phần khai báo lớp và sử dụng khai báo việc kế thừa thông qua việc truyền tên của lớp cha [lớp kế thừa] vào trong phần đầu lớp. Ví dụ. class SinhVien[ConNguoi] – to Khai báo lớp SinhVien kế thừa lớp ConNguoi
Lớp được định nghĩa trước để cho các lớp khác kế thừa thường được gọi là lớp cha [hoặc có thể gọi là lớp cơ sở], Lớp mới phát sinh và kế thừa Lớp đã được định nghĩa trước sẽ được gọi là lớp con [ . Khi một lớp con kế thừa lớp cha thì lớp con sẽ có thể có tất cả các thuộc tính và phương thức của lớp cha. Ngoài ra, lớp con còn có thể mở rộng các thành phần kế thừa từ lớp cha và bổ sung thêm các thành phần mới
Ví dụ dưới đây, khai báo lớp cha có tên ConNguoi bao gồm các thuộc tính. HoTen, Tuoi, GioiTinh and bao gồm các phương thức. an[], noi[], hoc[]. Tiếp theo, khai báo lớp có tên SinhVien – lớp này sẽ kế thừa lớp ConNguoi và có thêm các phương thức. Msv, DiemTongKet và các phương thức. DangKyMon[], XepLoai[] as side bottom
class ConNguoi: def __init__[self, ten, tuoi, gioitinh]: # Khai bao cac thuoc tinh ConNguoi self.HoTen = ten self.Tuoi = tuoi self.GioiTinh = gioitinh # Khai bao cac phuong thuc ConNguoi def an[self]: print[self.HoTen + " co the an!"] def noi[self]: print[self.HoTen + " co the noi!"] def hoc[self]: print[self.HoTen + " co the hoc!"] # Khai bao lop SinhVien ke thua lop ConNguoi class SinhVien[ConNguoi]: # Khai bao thuoc tinh lop SinhVien def __init__[self, msv, dtk, xl]: # Khai bao cac thuoc tinh SinhVien self.MaSinhVien = msv self.DiemTongKet = dtk self.XepLoai = xl # Khai bao cac phuong thuc SinhVien def DangKyMon[self]: print["Sinh vien " + self.HoTen + " co the dang ky mon!"] def DanhGia[self]: print["Sinh vien " + self.HoTen + " xep loai " + self.XepLoai] # Khoi tao doi tuong sv1 tu lop SinhVien sv1 = SinhVien[208102103, 9.5, "gioi"] # Truy cap cac thuoc tinh trong lop ConNguoi thong qua lop SinhVien sv1.HoTen = "Chu Minh Nam" sv1.Tuoi = 20 sv1.GioiTinh = "nam" print["Ho Ten SV: {0}".format[sv1.HoTen]] print["Tuoi SV: {0}".format[sv1.Tuoi]] print["Gioi Tinh SV: {0}".format[sv1.GioiTinh]] # Truy cap cac phuong thuc trong lop ConNguoi thong qua lop SinhVien sv1.an[] sv1.noi[] sv1.hoc[] # Truy cap cac thuoc tinh lop SinhVien print["MSV: {0}".format[sv1.MaSinhVien]] print["DTK: {0}".format[sv1.DiemTongKet]] # Truy cap cac phuong thuc lop SinhVien sv1.DangKyMon[] sv1.DanhGia[]
Kết quả
SV Hồ Mười. Chu Minh NamTuổi SV. 20
Giới Tính SV. tên
Chu Minh Nam co the an
Chu Minh Nam co the noi
Chu Minh Nam co the hoc
MSV. 208102103
ĐTK. 9. 5
Sinh vien Chu Minh Nam co the dang ky mon
Sinh vien Chu Minh Nam xep loai
Trong ví dụ trên, ta thấy rằng lớp SinhVien kế thừa lớp ConNguoi. Khi tạo mới một đối tượng cho lớp SinhVien ta hoàn toàn có thể gọi và sử dụng lại các thuộc tính và phương thức có trong cả hai lớp đó là SinhVien và ConNguoithông qua đối tượng sv1. Trong lớp SinhVien ta cũng có thể gọi trực tiếp các thuộc tính có trong lớp ConNguoi để sử dụng cho lớp SinhVien. Ví dụ như câu lệnh này
def DangKyMon[self]: print["Sinh vien " + self.HoTen + " co the dang ky mon!"]
Thuộc tính HoTen nằm trong lớp ConNguoi nhưng lại có thể sử dụng được trong phương thức DangKyMon[] của lớp SinhVien bởi vì tính kế thừa
2. Đa kế thừa [Multiple Inheritance] trong PythonKế thừa là việc một lớp cha được kế thừa bởi nhiều hai hoặc nhiều hơn các lớp con. Khi các lớp con [lớp dẫn xuất] kế thừa một lớp cha [lớp cơ sở] thì tất cả các thuộc tính, phương thức của lớp cha cũng đều có thể thực hiện và sử dụng trong các lớp con
Xem minh họa dưới đây để hiểu rõ hơn về đa kế thừa trong Python
Dán trên, cho thấy lớp Con Người là lớp cha và được kế thừa bởi các lớp Sinh Viên, Giảng Viên và lớp Kỹ Sư. Như vậy, Lớp Con Người có 3 lớp con được kế thừa và chúng ta gọi cuộc kế thừa này là đa kế thừa
Ví dụ dưới đây, miêu tả công việc đa kế thừa thông qua lớp ConNguoi làm lớp cha [lớp cơ sở] và các lớp. SinhVien, GiangVien, KySu làm lớp con [lớp dẫn xuất] kế thừa từ lớp cha ConNguoi
class ConNguoi: def __init__[self, ten, tuoi, gioitinh]: # Khai bao cac thuoc tinh ConNguoi self.HoTen = ten self.Tuoi = tuoi self.GioiTinh = gioitinh # Khai bao lop SinhVien ke thua lop ConNguoi class SinhVien[ConNguoi]: def __init__[self, msv, dtk, xl]: # Khai bao cac thuoc tinh SinhVien self.MaSinhVien = msv self.DiemTongKet = dtk self.XepLoai = xl # Khai bao lop GiangVien ke thua lop ConNguoi class GiangVien[ConNguoi]: def __init__[self, mgv, cn, xlgv]: # Khai bao cac thuoc tinh GiangVien self.MaGiangVien = mgv self.ChuyenNganh = cn self.XepLoaiGiangVien = xlgv # Khai bao lop KySu ke thua lop ConNguoi class KySu[ConNguoi]: def __init__[self,mks,cv,xlks]: self.MaKySu = mks self.ChucVu = cv self.XepLoaiKySu =xlks # Khoi tao doi tuong sv1 tu lop SinhVien sv1 = SinhVien[208102103, 9.5, "gioi"] # Truy cap cac thuoc tinh trong lop ConNguoi thong qua lop SinhVien sv1.HoTen = "Chu Minh Nam" sv1.Tuoi = 20 sv1.GioiTinh = "nam" print["Ho Ten SV: {0}".format[sv1.HoTen]] print["Tuoi SV: {0}".format[sv1.Tuoi]] print["Gioi Tinh SV: {0}".format[sv1.GioiTinh]] print["MSV: {0}".format[sv1.MaSinhVien]] print["Diem Tong Ket: {0}".format[sv1.DiemTongKet]] print["Xep Loai SV: {0}\n".format[sv1.XepLoai]] # Khoi tao doi tuong gv1 tu lop GiangVien gv1 = GiangVien[112056368, "Cong Nghe Thong Tin", "kha"] # Truy cap cac thuoc tinh trong lop ConNguoi thong qua lop SinhVien gv1.HoTen = "Vu Van Dinh" gv1.Tuoi = 40 gv1.GioiTinh = "nam" print["Ho Ten GV: {0}".format[gv1.HoTen]] print["Tuoi GV: {0}".format[gv1.Tuoi]] print["Gioi Tinh GV: {0}".format[gv1.GioiTinh]] print["MGV: {0}".format[gv1.MaGiangVien]] print["Chuyen Nganh GV: {0}".format[gv1.ChuyenNganh]] print["Xep Loai GV: {0}\n".format[gv1.XepLoaiGiangVien]] # Khoi tao doi tuong ks1 tu lop KySu ks1 = KySu[163569879, "Ky Su Xay Dung", "gioi"] # Truy cap cac thuoc tinh trong lop ConNguoi thong qua lop SinhVien ks1.HoTen = "Tran Bao Huy" ks1.Tuoi = 28 ks1.GioiTinh = "nam" print["Ho Ten KS: {0}".format[ks1.HoTen]] print["Tuoi KS: {0}".format[ks1.Tuoi]] print["Gioi Tinh KS: {0}".format[ks1.GioiTinh]] print["MKS: {0}".format[ks1.MaKySu]] print["Chuc Vu KS: {0}".format[ks1.ChucVu]] print["Xep Loai KS: {0}".format[ks1.XepLoaiKySu]]
Kết quả
SV Hồ Mười. Chu Minh NamTuổi SV. 20
Giới Tính SV. tên
MSV. 208102103
Điểm Tông Kết. 9. 5
SV Xep Loai. giới
Ho Ten GV. Vũ Văn Định
GV Tươi. 40
Giới Tinh GV. tên
MGV. 112056368
Chuyên Ngạnh GV. Công Nghệ Thông Tín
Xep Loai GV. khả
KS Hồ Tên. Trần Bảo Huy
KS Tươi. 28
Giới Tình KS. tên
MKS. 163569879
KS Chúc Vũ. Kỷ Sự Xây Dựng
KS Xep Loai. giới
Trong ví dụ trên, các lớp SinhVien, GiangVien, KySu đã kế thừa từ lớp cha ConNguoi. Vì vậy, khi khai báo các đối tượng sv1, gv1, ks1 thì đều có thể sử dụng các thuộc tính chung của lớp ConNguoi và các thuộc tính riêng của từng lớp
3. Kế thừa đa cấp [Multilevel Inheritance] trong PythonKế thừa đa cấp là việc các lớp con mới được tạo ra sẽ kế thừa các lớp con đã được thực hiện kế thừa một lớp cha được định nghĩa trước đó. Việc kế thừa đa cấp này được hiểu như mối quan hệ giữa các thế hệ trong một gia đình. Đó là mối quan hệ ông–>cha–>con
Xem hình minh họa bên dưới đây để hiểu rõ hơn về kế thừa đa cấp trong Python
Hình trên, cho thấy rằng Lớp Con Người là Lớp Cha và được kế thừa bởi Lớp Sinh Viên. Sau đó Lớp Sinh Viên lại được coi là Lớp Cha và được kế thừa bởi Lớp Trưởng. Như vậy, lớp Con Người có lớp con là Sinh Viên, lớp Sinh Viên lại có lớp con là Lớp Trường chúng ta gọi kế thừa đây là kế thừa đa cấp
Ví dụ dưới đây, sử dụng báo cáo 3 lớp. ConNguoi, SinhVien, LopTruong. Trong đó Lớp SinhVien kế thừa lớp ConNguoi và lớp LopTruong sẽ kế thừa lớp SinhVien để tạo ra một kế thừa đa cấp ConNguoi–>SinhVien–>LopTuong
class ConNguoi: def __init__[self, ten, tuoi, gioitinh]: # Khai bao cac thuoc tinh ConNguoi self.HoTen = ten self.Tuoi = tuoi self.GioiTinh = gioitinh # Khai bao lop SinhVien ke thua lop ConNguoi class SinhVien[ConNguoi]: def __init__[self, msv, dtk, xl]: # Khai bao cac thuoc tinh SinhVien self.MaSinhVien = msv self.DiemTongKet = dtk self.XepLoai = xl # Khai bao lop LopTruong ke thua lop SinhVien class LopTruong[SinhVien]: def __init__[self, lh, nv]: # Khai bao cac thuoc tinh LopTruong self.LopHoc = lh self.NhiemVu = nv # Khoi tao doi tuong lt1 tu lop LopTruong lt1 = LopTruong["D15CNTT2","Quan Ly Lop Hoc"] # Truy cap cac thuoc tinh trong lop ConNguoi thong qua lop LopTruong lt1.HoTen = "Tran Ngoc Ha" lt1.Tuoi = 20 lt1.GioiTinh = "nu" print["Ho Ten LT: {0}".format[lt1.HoTen]] print["Tuoi LT: {0}".format[lt1.Tuoi]] print["Gioi Tinh LT: {0}".format[lt1.GioiTinh]] # Truy cap cac thuoc tinh trong lop SinhVien thong qua lop LopTruong lt1.MaSinhVien = 265463215 lt1.DiemTongKet = 10 lt1.XepLoai = "gioi" print["MSV: {0}".format[lt1.MaSinhVien]] print["Diem Tong Ket: {0}".format[lt1.DiemTongKet]] print["Xep Loai SV: {0}".format[lt1.XepLoai]] # Truy cap cac thuoc tinh co trong lop LopTruong print["Lop hoc: {0}".format[lt1.LopHoc]] print["Nhiem vu: {0}".format[lt1.NhiemVu]]
Kết quả
Hồ Mười LT. Trần Ngọc HàTuổi LT. 20
Giới Tính LT. nu
MSV. 265463215
Điểm Tông Kết. 10
SV Xep Loai. giới
lớp học. D15CNTT2
nhiệm vụ. Quán Lý Lộp Học
Trong ví dụ trên, lớp SinhVien kế thừa lớp ConNguoi và lớp LopTruong kế thừa lớp SinhVien. Như vậy, lớp LopTruong sẽ được coi là kế thừa của cả hai lớp SinhVien và ConNguoi. Vì thế, khi khai báo các đối tượng lt1 thì các đối tượng này đều có thể sử dụng các thuộc tính của cả hai lớp ConNguoi và lớp SinhVien bên ngoài ra, các đối tượng này còn sử dụng được các thuộc tính của chính nó