1. Lập trình hướng đối tượng trong Python

Lập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một kỹ thuật lập trình phổ biến đây là kỹ thuật hỗ trợ và cho phép lập trình viên trực tiếp làm việc với các đối tượng mà họ định nghĩa.

Ngôn ngữ Python là một ngôn ngữ bậc và Python cho phép sử dụng phương pháp, kỹ thuật lập trình hướng đối tượng. Python hỗ trợ rất mạnh về lập trình hướng đối tượng, hầu hết mọi thứ trong Python đều được xây dựng từ một lớp và ta thường gọi ra để sử dụng các hàm, các phương thức, các thuộc tính trong lớp có sẵn đó. Ngoài ra chúng ta có thể dễ dàng định nghĩa các đối tượng trong Python và sử mục cách lập trình này cho nhiều mục đích khác nhau.

Một ví dụ đơn giản, khai báo một lớp (class) trong Python như sau:

class MyClass:
  x = 15

print(MyClass)

Trong đó:

  • class là từ khóa để tạo một lớp.
  • MyClass là tên của lớp.
  • x = 15 là một thuộc tính có trong lớp có giá trị được gán bằng 15.

2. Lớp và đối tượng trong Python

2.1 Tạo lớp và đối tượng trong Python

Trong lập trình hướng đối tượng, không thể thiếu các lớp (hay còn gọi là class) và các đối tượng (hay còn gọi là object). Trong đó:

  • Lớp (Class) là một kiểu dữ liệu đặc biệt do người dùng định nghĩa, tập hợp nhiều thuộc tính đặc trưng cho mọi đối tượng được tạo ra từ lớp đó.
  • Đối tượng (Object) là những thực thể tồn tại có hành vi.

Trong một lớp (hay class) có thể tồn tại nhiều thuộc tính và phương thức. Thuộc tính là các giá trị của lớp. Sau này khi các đối tượng được tạo ra từ lớp, thì thuộc tính của lớp lúc này sẽ trở thành các đặc điểm của đối tượng đó.

Ví dụ dưới đây, khai báo một đối tượng ConNguoi trong Python như sau:

class ConNguoi:
    HoTen = "Chu Minh Nam"
    Tuoi = 20
    GioiTinh = "nam"

print(ConNguoi)

Kết quả:

<class ‘__main__.ConNguoi’>

Giải thích:

  • class ConNguoi là việc định nghĩa ra một lớp có tên ConNguoi
  • HoTen, Tuoi, GioiTinh là định nghĩa ra các thuộc tính có trong lớp ConNguoi. Các thuộc tính này được gán cho một giá trị cụ thể.

Sau khi khai báo một lớp (class), để sử dụng được chúng ta cần khởi tạo ra một đối tượng (hay một thực thể) để sử dụng lớp (class) ConNguoi thông qua đối tượng thực thể đó.

class ConNguoi:
    HoTen = "Chu Minh Nam"
    Tuoi = 20
    GioiTinh = "nam"

# Khoi tao doi tuong p1 tu lop ConNguoi
p1 = ConNguoi()

# Truy cap cac thuoc tinh trong lop ConNguoi thong qua doi tuong p1
name = p1.HoTen
age = p1.Tuoi
sex = p1.GioiTinh

# Hien thi gia tri cua cac thuoc tinh 
print(name)
print(age)
print(sex)

Kết quả:

Chu Minh Nam
20
nam

2.2 Sự khác biệt giữa lớp và đối tượng trong Python

Lớp và đối tượng tưởng chừng như chẳng có sự khác biệt nào bởi vì chúng đều thuộc phạm vi của một thực thể nào đó. Thế nhưng, sự thật thì lớp và đối tượng lại có nhiều sự khác biệt mà chúng ta không nên nhầm lẫn.

  • Một lớp (hay class) có thể được định nghĩa như là một template chúng sẽ được coi như là một khuân mẫu dùng để mô tả trạng thái và hành vi mà loại đối tượng của lớp hỗ trợ. Một đối tượng được khai báo từ lớp sẽ là một thực thể của một lớp
  • Một đối tượng (hay object) là một thực thể tồn tại có trạng thái và hành vi. Một đối tượng sẽ sử dụng lại khuân mẫu mà một lớp tạo ra.

Ví dụ: Chúng ta có một lớp (class) Oto bao gồm các thuộc tính như: tên máy, màu sắc, tên hãng, trọng lượng, giá bán… – các thuộc tình này sẽ được coi là một tempate cho các thực thể Oto tồn tại. Một đối tượng (object) hay các thực thể muốn sử dụng được lớp Oto cần phải có những thuộc tính trên làm khuân mẫu, ngoài ra đối tượng này còn có thể có một số hành vi trạng thái.

3. Thuộc tính và phương thức trong Python

3.1 Thuộc tính trong lập trình hướng đối tượng Python

Thuộc tính (hay còn gọi là Property) của một lớp trong lập trình hướng đối tượng là một biến trong Python. Biến này sẽ được định nghĩa bên trong phần thân của một lớp. Các thuộc tính thể hiện các đặc điểm, tính chất của một đối tượng.

Các thuộc tính trong Python khi được khởi tạo thì cần kèm theo giá trị được gán cho thuộc tính đó. Khi khai báo một đối tượng cho một lớp, để sử dụng thuộc tính ta chỉ cần sử dụng toán tử “.” (toán tử chấm) để truy cập vào một thuộc tính.

Ví dụ dưới đây, khai báo lớp GiangVien bao gồm các thuộc tính: MaGiangVien, ChuyenNganh, XepLoaiGiangVien. Sau đó khởi tạo đối tượng gv1 và truy cập các thuộc tính trong lớp thông qua toán tử “.” như sau:

# Khai bao lop GiangVien ke thua lop ConNguoi
class GiangVien():
    # Khai bao cac thuoc tinh GiangVien
    MaGiangVien = 112056368
    ChuyenNganh = "Cong Nghe Thong Tin"
    XepLoaiGiangVien = "kha"

# Khoi tao doi tuong gv1 tu lop GiangVien
gv1 = GiangVien()

# Truy cap cac thuoc tinh trong lop GiangVien 
print("MGV: {0}".format(gv1.MaGiangVien))
print("Chuyen Nganh GV: {0}".format(gv1.ChuyenNganh))
print("Xep Loai GV: {0}\n".format(gv1.XepLoaiGiangVien))

Kết quả:

MGV: 112056368
Chuyen Nganh GV: Cong Nghe Thong Tin
Xep Loai GV: kha

3.2 Phương thức trong lập trình hướng đối tượng Python

Phương thức (hay còn gọi là method) của một lớp trong lập trình hướng đối tượng là một hàm def được định nghĩa bên trong phần thân một lớp. Các thuộc tính thường thể hiện cho một hành động, hành vi mà đố tượng đó có thể thực hiện.

Các thuộc tính trong một lớp bắt buộc phải có tham số mặc định đó là self – tham số này tương tự như con trỏ this trong các ngôn ngữ C, C++, Java… tham số này thực hiện trỏ đến chính class chứa thuộc tính.

Ví dụ dưới đây, khai báo lớp GiangVien, lớp này bao gồm các phương thức GiangDay(), ChamThi(). Sau đó khởi tạo một đối tượng gv1 và truy cập đến các phương thức trong lớp này bằng toán tử “.” như sau:

# Khai bao lop GiangVien ke thua lop ConNguoi
class GiangVien():
    # Khai bao cac thuoc tinh GiangVien
    MaGiangVien = 112056368
    ChuyenNganh = "Cong Nghe Thong Tin"
    XepLoaiGiangVien = "kha"
    # Khai bao cac phuong thuoc GiangVien
    def GiangDay(self):
        print("Giang vien dang giang day chuyen nganh: {0}".format(self.ChuyenNganh))
    def ChamThi(self):
        print("Giang vien dang cham thi voi ma giang vien: {0}".format(self.MaGiangVien))

# Khoi tao doi tuong gv1 tu lop GiangVien
gv1 = GiangVien()

# Truy cap cac phuong thuc trong lop GiangVien
gv1.GiangDay()
gv1.ChamThi()

Kết quả:

Giang vien dang giang day chuyen nganh: Cong Nghe Thong Tin
Giang vien dang cham thi voi ma giang vien: 112056368

4. Các tính chất lập trình hướng đối tượng trong Python

Trong Python, khi sử dụng kỹ thuật lập trình hướng đối tượng thì cần phải tuân theo một số tính chất mà chỉ có ở trong lập trình hướng đối tượng. Các tính chất đó bao gồm: tính đóng gói, tính kế thừa và tính đa hình.

  • Tính kế thừa (Inheritance): là tính chất cơ bản trong lập trình hướng đối tượng, tính chất này sẽ cho phép một lớp (class) có thể kế thừa các thuộc tính và phương thức từ các lớp khác đã được định nghĩa. Việc kế thừa này giúp một lớp có thể sử dụng các thuộc tính và phương thức của lớp khác.
  • Tính đóng gói (Encapsulation): là tính chất theo hướng bảo mật trong lập trình hướng đối tượng, tính chất này sẽ là một quy tắc yêu cầu trạng thái bên trong của một đối tượng được bảo vệ và tránh truy cập được từ các đối tượng hay đoạn mã truy cập ở bên ngoài đối tượng. Việc đóng gọi nghĩa là tránh các đoạn mã bên ngoài không thể nhìn thấy và thay đổi trạng thái của đối tượng đó.
  • Tính đa hình (Polymorphism): là tính chất là tính chất biến hóa theo nhiều hình thức trong lập trình hướng đối tượng, tính chất này dựa theo khái niệm cho phép hai hoặc nhiều lớp có những phương thức giống nhau nhưng có thể thực thi theo những cách thức khác nhau. Việc đa hình cho thấy sự đa dạng và trừu tượng trong mỗi một lớp, không nhất thiết rằng các lớp có phương thức giống nhau là phải thực hiện các các hành động giống nhau.
  • Tính trừu tượng (Abstract): là tính chất chỉ đưa ra các thành phần trong một đối tượng mà không hề thực hiện hành động gì với thành phần đó. Việc này cho phép chúng ta tạo ra các phương thức trừu tượng trong một lớp – các phương thức trừu tượng sẽ chỉ có phần khai báo nhưng lại không tồn tại phần thân.