Lập trình hướng đối tượng python

Lập trình hướng đối tượng là phương thức tiên tiến được ứng dụng trong nhiều ngôn ngữ lập trình trên thế giới, được ưa chuộng sử dụng bởi các lập trình viên do lập trình hướng đối tượng giúp tinh gọn, đơn giản hóa các dòng lệnh phức tạp. Python là ngôn ngữ lập trình ứng dụng phương thức này một cách triệt để, góp phần khiến python trở nên đơn giản, dễ dùng. Vậy hãy cùng MCI tìm hiểu lập trình hướng đối tượng python là như thế nào nhé.

Tổng quan lập trình hướng đối tượng Python

lập trình hướng đối tượng python
Lập Trình Hướng Đối Tượng Trong Python

Lập trình hướng đối tượng (tiếng Anh là Object-Oriented Programming – OOP) là phương thức kỹ thuật trong đó lập trình viên định nghĩa một đối tượng và gọi đối tượng đó ra sử dụng khi cần bằng những ký hiệu hoặc tên được nhà lập trình định nghĩ trước đó.

Lập trình hướng đối tượng Python còn được gọi là DRY (Don’t Repeat Yourself) ám chỉ việc hạn chế việc sử dụng lại những dòng lệnh tương tự nhau.

Phương thức này giúp rút ngắn thời gian thực hiện dự án, đơn giản hóa câu lệnh, giảm dung lượng file code, dễ dàng bảo trì, tối ưu và mở rộng trong tương lai.

Nguyên lý cơ bản của OOP trong python

Lập trình hướng đối tượng Python tuân theo 3 nguyên lý sau:

  1. Tính kế thừa (Inheritance): cho phép một class sử dụng các thuộc tính và phương thức từ các class khác đã được định nghĩa mà không cần định nghĩa lại.
  2. Tính đóng gói (Encapsulation): là nguyên lý chỉ các dòng lệnh thực thi bên trong một đối tượng không thể bị thay đổi hoặc can thiệp trực tiếp từ bên ngoài
  3. Tính đa hình (Polymorphism): là nguyên lý chỉ việc nhiều class có những cách thức hoạt động tương tự nhau nhưng có thể thực thi theo cách thức khác nhau.

Một số khái niệm thuật ngữ lập trình hướng đối tượng python bạn cần nắm

Đối tượng (Object) và Lớp (Class)

Đối tượng (tiếng Anh: Object) trong lập trình hướng đối tượng python là một thực thể được quy định đặc tính, hành vi

Lớp (tiếng Anh: Class): một kiểu dữ liệu do người dùng định nghĩa bằng những dòng lệnh, quy định các thuộc tính do người dùng tự tạo

Cấu trúc cú pháp:
class ClassName:
   statement_1
   ...
   statement_n

Khác nhau giữa đối tượng và hành vi

Đối tượng (Object) có thuộc tính và hành vi được quy định

Lớp (Class) như một định dạng mẫu mô tả thuộc tính và hành vi của đối tượng mà lớp đó hỗ trợ

=> Một đối tượng (Object) là thực thể (instance) của một lớp (Class) trong lập trình hướng đối tượng python

Ví dụ

class Dog:

# thuộc tính lớp
loaicon = "Chó"

# thuộc tính đối tượng
def __init__(self, tencho, giongcho ,maulong):
    self.tencho= tencho
    self.giongcho= giongcho
    self.maulong= maulong

# Khởi tạo class Dog
Chihuahua = Dog(‘’kiki” ,"Chihuahua", "Đỏ")
Bulldog = Dog(“ben” ,"Bulldog", "Vàng")
Pug = Dog(“bắc” ,"Pug", "Xanh")

# Truy cập thuộc tính của class
print("Chihuahua là {}.".format(Chihuahua.__class__.loaicon))
print("Bulldog là {}.".format(Bulldog.__class__. loaicon))
print("Pug cũng là {}.".format(Pug.__class__. loaicon))

# Truy cập các thuộc tính thực thể
print("Chó {} có màu {}, thuộc giống chó {}".format( Chihuahua.tenxe, Chihuahua.mausac, Chihuahua.nguyenlieu))
print("Chó {} có màu {}, thuộc giống chó {}".format( Bulldog.tenxe, Bulldog.mausac, Bulldog.nguyenlieu))
print("Chó {} có màu {}, thuộc giống chó {}".format( Pug.tenxe, Pug.mausac, Pug.nguyenlieu))

Kết quả:

Chihuahua là Chó.
Bulldog là Chó.
Pug cũng là Chó.
Chó kiki có màu Đỏ, thuộc giống chó Chihuahua.
Chó ben có màu Đỏ, thuộc giống chó Bulldog.
Chó bắc có màu Đỏ, thuộc giống chó Pug.

Trong phần thuộc tính đối tượng:

  • Dòng 1: __init__ là phương thức tự động được gọi khi 1 đối tượng được tạo. Phương thức này có thể có hoặc không các tham số, tham số đầu tiên bắt buộc phải là self.
  • Dòng 4, 5: quy định các thuộc tính trong class. Lưu ý bắt buộc phải truy xuất các class thông qua tham số self

Lưu ý:

  • Không thể khai báo 2 phương thức __init__ trong cùng 1 class.
  • self dùng để tham chiếu đến chính đối tượng đang được thao tác.

Phương thức (Method)

Phương thức (tiếng Anh: Method) trong lập trình hướng đối tượng python chính là các hàm lệnh bên trong cấu tạo của một Class, có chức năng chính là xác định hành vi của đối tượng (Object)

Ví dụ

class Dog:

# thuộc tính đối tượng
def __init__(self, tencho, giongcho ,maulong):
        self.tencho= tencho
        self.giongcho= giongcho
        self.maulong= maulong

  # phương thức
  def ngoi(self, mucdich):
        return "{} đang ngồi để {}".format(self.tencho,mucdich)
  def chay(self):
        return "{} đang chạy trên vỉa hè".format(self.tencho)
  def sua(self):
        return "{} đang sủa".format(self.tencho)

# Khởi tạo class Dog
Chihuahua = Dog(‘’kiki” ,"Chihuahua", "Đỏ")
Bulldog = Dog(“ben” ,"Bulldog", "Vàng")
Pug = Dog(“bắc” ,"Pug", "Xanh")

# Gọi các phương thức của thực thể
print(kiki.ngoi("liếm lông"))
print(ben.chay())
print(bắc.sua())

Kết quả là:

kiki đang ngồi để liếm lông
ben đang chạy trên vỉa hè
bắc đang sủa

Trong ví dụ trên, các bạn có thể thấy có 3 phương thức được định nghĩa bao gồm: ngoi(), chay(), sua()

Tính Kế Thừa (Inheritance)

Tính kế thức trong lập trình hướng đối tượng python cho phép một class có thể sử dụng các thuộc tính và phương thức từ các class đã được định nghĩa trước đó

Có thể hiểu đơn giản hơn, lớp kế thừa thuộc tính của lớp khác được gọi là lớp con, lớp đã được định nghĩa trước đó gọi là lớp cha

Class con kế thừa các thành phần của class cha và có thể mở rộng và bổ sung các thành phần mới

Ví dụ:

class Dog:

# thuộc tính đối tượng
def __init__(self, tencho, giongcho ,maulong):
    self.tencho= tencho
    self.giongcho= giongcho
    self.maulong= maulong

# phương thức
def ngoi(self, mucdich):
        return "{} đang ngồi để {}".format(self.giongcho,mucdich)
def chay(self):
        return "{} đang chạy trên vỉa hè".format(self.giongcho)

# Lớp Chihuahua mở rộng từ lớp Dog
class Chihuahua(Dog):
     def __init__(self, tencho, giongcho ,maulong, thucan):

# Gọi tới constructor của lớp cha (Dog) để gán giá trị vào thuộc tính của lớp cha
super().__init__(tencho, giongcho ,maulong)
        self.thucan = thucan

# Kế thừa phương thức cũ
def chay(self):
        print ("{} đang chạy trên vỉa hè".format(self.giongcho))

# Ghi đè phương thức cùng tên của lớp cha.
def ngoi(self, mucdich):
        print ("{} đang ngồi để {}".format(self.giongcho, mucdich))
        print ("{} thích ăn {}".format(self.giongcho, self.thucan))

# Bổ sung thêm thành phần mới
def sua(self):
        print ("{} đang sủa".format(self.giongcho))

Chihuahua1 = Toyota("Chihuahua", "Chihuahua A", "Đỏ", "Thịt")
Chihuahua2 = Toyota("Chihuahua", "Chihuahua B", "Vàng", "Rau")
Chihuahua3 = Toyota("Chihuahua", "Chihuahua C", "Xanh", "Xương")

Chihuahua1.ngoi("liếm lông")
Chihuahua2.chay()
Chihuahua3.sua()

Kết quả:

Chihuahua A đang ngồi để liếm lông
Chihuahua A thích ăn Thịt
Chihuahua B đang chạy trên vỉa hè
Chihuahua C đang sủa

Tính Đóng gói (Encapsulation)

Tính đóng gói trong lập trình hướng đối tượng python áp dụng nhằm tránh những truy cập vào các hàm thuộc tính lõi của đối tượng.

Trong ngôn ngữ lập trình Python, bạn có thể biểu thị tính đóng gói bằng cách sử dụng dấu gạch dưới làm tiền tố như: “_” hoặc “__”

Ví dụ

class Dog:

def __init__(self):        

# Áp dụng tính đóng gói ngăn chặn sửa đổi trực tiếp      
self.__maxprice = 1000000

def sell(self):  
       print("Giá bán của chó: {}".format(self.__maxprice))
def setMaxPrice(self, price):  
      self.__maxprice = price

c = Dog()c.sell()

# thay đổi giá
c.__maxprice = 2000000
c.sell()

# thay đổi giá bằng hàm setter
c.setMaxPrice(2000000)
c.sell()

Kết quả là:

Giá bán của chó: 900
Giá bán của chó: 900
Giá bán của chó: 1000

Tính đa hình (Polymorphism)

Tính đa hình trong lập trình hướng đối tượng python chỉ đến các Class chứa những phương thức tương tự nhau nhưng được thực thi theo các cách khác nhau

Ví dụ

class Chihuahua:
     def ngoi(self):        
print("Chihuahua ngồi để liếm lông")
     def sua(self):        
print("Chihuahua đang sủa")
class Bulldog:
     def ngoi(self):       
 print("Bulldog ngồi để quan sát")
     def sua(self):       
 print("Bulldog đang sủa tên trộm")

# Tạo hàm chung
def kiemtra_ngoi(Dog): Dog.ngoi()

# Khởi tạo đối tượng
Chihuahua = Chihuahua()
Bulldog = Bulldog()

# Truyền đối tượng vào hàm
kiemtra_ngoi(Chihuahua)
kiemtra_ngoi(Bulldog)

Kết quả:

Chihuahua ngồi để liếm lông
Bulldog ngồi để quan sát

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *