Python là ngôn ngữ thông dịch (interpreter), hỗ trợ các cách thức lập trình hướng đối tượng (Object-Oriented Programming ) như một số ngôn ngữ Java hay C#. Nó cũng tuân theo một số nguyên lý cơ bản của OOP bao gồm tính đóng gói, tính kế thừa, tính đa hình và tính trừu tượng. OOP trong python

1. Lớp (class) và đối tượng (Object)

ClassObject là hai khái niệm quan trọng trong OOP mà rất nhiều bạn hay nhầm lẫn

  1. class là một kiểu dữ liệu do người dùng tự định nghĩa, bao gồm các biến, thuộc tính đặc trưng cho đối tượng đó
  2. object là những thực thể được khởi tạo từ class.

Hãy tưởng tượng class như một chiếc khuôn định nghĩa một thực thể sẽ có thuộc tính gì, hành vi như thế nào, Object là hiện thực hoá thực thể đó. Ví dụ người có tay có chân, nhưng tuỳ mỗi người mà tay và chân có thể khác màu da, kích thước. Để mô phỏng, mình sẽ lấy ví dụ về một lớp Person.

Class và Object

Triển code luôn cho dễ hiểu, code flow sẽ như sau:

  1. Tạo 1 class Person với thuộc tính là chiều cao và ngôn ngữ bằng hàm __init__
  2. Tạo một phương thức say_hello, tuỳ vào Person ở nước nào mà sẽ có phương thức say_hello khác nhau
# Khai báo class
class Person:
    def __init__(self, height: float, language: str):
        pass

    def say_hello(self):
        return f"I'm come from {language}"

# Khởi tạo object từ class
john = Person(height=190.5, language="English")
john.say_hello()

nick = Person(height=180, language="Vietnam") 
nick.say_hello()

2. OOP trong Python

Trong phần này, chúng ta sẽ lấy lại ví dụ về lớp Person.

Tính kế thừa (Inheritance)

Usecase: Tính kế thừa giúp việc tạo các Class mới từ các Class đã tồn tại với việc thêm vào hoặc sửa chữa các thuộc tính, phương thức của Class cũ. Điều này giúp giảm tình trạng reuse code, khi bạn sử dụng kế thừa, class mới sẽ tự động sử dụng lại tất cả các code cũ mà không cần phải copy thứ gì từ nó.

Giả sử lớp mọi con người đều nói được Hello world !!!, thì ta chỉ cần khai báo phương phức speak trong Person để các lớp khác có thể sử dụng.

class Person():
    def speak():
        print("Hello world!!!")
        return
        
class PersonAsia(Person):
    pass

person = PersonAsia()
person.speak()
# output: Hello world!!!

Bằng cách sử dụng tính kế thừa mà lớp PersonAsia không cần phải khai báo lại phương thức speak mà có thể sử dụng nó từ lớp cha Person

Tính trừu tượng (Abstraction)

Usecase: Khi một Class con được khởi tạo, nó sẽ kế thừa mọi thuộc tính và phương thức từ lớp cha của nó. Làm sao để lớp con có thể thay thế hay ghi đè lớp cha? Đó chính là đặc trưng của tính trừu tượng. Tính trừu tượng cho phép các lớp con ghi đè lại các phương thức hay thuộc tính của lớp cha.

Tính đa hình (Polymorphism)

Usecase: hai hay nhiều lớp có phương thức giống nhau nhưng lại thực hiện các hành vi theo những các thức khác nhau

Ví dụ:

class PersonX():
    def speak()):
        print("Im X person")

class PersonY():
    def speak():
        print("Im Y person")

def person_speak(person):
    person.speak()


person_x = PersonX()
person_speak(person_x)
# Im X person

person_y = PersonY()
person_speak(person_y)
# Im Y person

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

Usecase: đây là một trong những tính chất quan trọng của Lập trình hướng đối tượng. Tính đóng gói giúp ngăn chặn việc truy cập, thay đổi thuộc tính, phương thức của một lớp một cách trực tiếp, giúp che giấu dữ liệu (data hiding)

Về cơ bản, trong Python không có các thuộc tính, phương thức private, public hay protected như Java hay C#, nó được thực hiện theo cách khác

Các thuộc tính hay phương thức private chỉ có thể được sử dụng bên trong lớp chứa nó, Python sử dụng hai dấu gạch dưới (prefix) để làm tiền tố chỉ định một thuộc tính hay phương thức private.

3. Tổng kết

Qua bài viết vừa rồi, mình và các bạn đã đi qua các khái niệm cơ bản cũng như tính chất quan trọng trong lập trình hướng đối tượng.

Python là ngôn ngữ hỗ trợ lập trình hướng đối tượng, tuy nhiên việc thể hiện tính chất hướng đối tượng của Python thật sự không rõ ràng như Java hay C#.

Tuy nhiên OOP trong Python vẫn là một đặc trung rất hay, rất hữu ích trong quá trình phát triển phần mềm. Ở các bài tiếp theo mình sẽ đi sâu hơn và cụ thể hơn về OOP trong Python. Hẹn gặp các bạn ở bài sau !