Kế thừa trong python

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
1

3. 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
4

Như 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
5

Do đó, 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 Nam
Tuổ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 Python

Kế 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

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 Nam
Tuổ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 Python

Kế 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

Kế thừa 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ó