0

Object-oriented programming (lập trình hướng đối tượng)

1. OOP là gì

OOP là viết tắt của Object-oriented programming (lập trình hướng đối tượng). OOP là một mô hình lập trình dựa trên khái niệm Object (đối tượng), mà trong đó thường chứa 2 thành phần: attributes và methods.

2. Các thành phần chính trong OOP

image.png

Trong OOP sẽ bao gồm 2 thành phần chính là Class và Object:

2.1 Class (lớp) trong OOP:

Class (lớp) trong OOP là các template hay cấu trúc để phục vụ cho việc xây dựng nên các Object (đối tượng). Trong đó sẽ bao gồm một tập hợp các Attribute và Methods đẻ định nghĩa các đặc tính và hành vi cho các Object.

  • Attributes: định nghĩa các thông tin, đặc điểm cũng như các thuộc tính của Object.
  • Methods: định nghĩa các hành vi, phương thức cũng như các hành động thường có của Object.

Ví dụ: ta có thiết kế một class Student kế thừa lại class Person với các attributes là: student_id, name, age tác, gpa và methods: get_student_id, get_gpa,...

2.2 Object (đối tượng) trong OOP:

Object (đối tượng) là một instance của Class, có thể hiểu là một hiện thực hay ví dụ cụ thể của một Class. Vì thế Object khi khởi tạo sẽ mang đầy đủ thông tin cụ thể mà Class đã định nghĩa.

Ví dụ:

# Giả sử chúng ta đã có class `Student` được định nghĩa như ở trên
# Tạo một đối tượng mới từ class `Student`
student1 = Student(student_id="S001", name="John Doe", age=20, gpa=3.5)

3. Tính chất cơ bản trong OOP

image.png

3.1 Encapsulation (tính đóng gói)

image.png

Encapsulation là một kỹ thuật lập trình nền tảng được sử dụng để gom nhóm các attributes và methods cần thiết vào một Object. Kỹ thuật này còn được biết với tên gọi khác là Data/Information Hiding.

Data Hiding trong lập trình hướng đối tượng OOP thường dùng để bảo vệ các thành phần bên trong của Object (thường gọi là private). Các thành phần bên ngoài sẽ không được can thiệp và sử dụng các thành phần này trực tiếp mà phải thông qua các phương thức công khai (public).

Ví dụ:

Trong Python, các thuộc tính private được thể hiện bằng cách sử dụng dấu gạch dưới ( _ ) làm tiền tố. Ví dụ:

class Person:
    def __init__(self, name, age):
        self._name = name  # private attribute
        self._age = age  # private attribute

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

Abstraction trong lập trình hướng đối tượng (OOP) là một kỹ thuật cho phép người lập trình tập trung vào những gì một đối tượng làm mà không cần phải quan tâm đến cách nó thực hiện. Điều này được thực hiện bằng cách định nghĩa các phương thức ở dạng mô tả chung mà không cần chi tiết cụ thể. Tính trừu tượng giúp giảm sự phức tạp của chương trình và tăng cường khả năng tái sử dụng mã nguồn.

Ví dụ:

class Person:
    def __init__(self, name, age):
        self._name = name  # private attribute
        self._age = age  # private attribute
    ...
    # Phương thức trừu tượng để được định nghĩa lại ở các lớp con
    def get_details(self):
        pass

class Student(Person):
    def __init__(self, student_id, name, age, gpa):
        super().__init__(name, age)
        self._student_id = student_id  # private attribute
        self._gpa = gpa  # private attribute
    ...
    # Triển khai chi tiết của phương thức trừu tượng get_details
    def get_details(self):
        return f"Student ID: {self.get_student_id()}, Name: {self.get_name()}, Age: {self.get_age()}, GPA: {self.get_gpa()}"

Trong ví dụ trên:

  • Person là một class cơ sở có một phương thức trừu tượng get_details().
  • Student kế thừa từ Person, và nó cung cấp một triển khai cụ thể cho phương thức get_details()

Điều này minh họa tính trừu tượng trong OOP, chi tiết triển khai hàm get_details() trong class Person được ẩn đi và chỉ có sự triển khai cụ thể trong class Student được hiển thị.

3.3 Inheritance (tính kế thừa)

Inheritance trong lập trình hướng đối tượng OOP là một cơ chế xây dựng class mới dựa trên các class đã có. Các class kế thừa sẽ bao gồm toàn bộ các attributes và methods từ base class (lớp cơ sở) hay parent class (lớp cha).

Sử dụng Inheritance sẽ giúp các nhà phát triển tái sử dụng được các class đã có, giảm thiểu các duplication (sự trùng lặp) không cần thiết.

Inheritance trong OOP bao gồm 2 loại chính:

  • Single Inheritance (đơn kế thừa): class chỉ có thể kế thừa từ một parent class duy nhất.
  • Multiple inheritance (đa kế thừa): class có thể kế thừa từ nhiều parent class.

Ví dụ class Student trong ví dụ trên kế thừa class Person.

class Student(Person):
    def __init__(self, student_id, name, age, gpa):
        super().__init__(name, age)
        self._student_id = student_id  # private attribute
        self._gpa = gpa  # private attribute
    ...

3.4 Polymorphism (tính đa hình)

Polymorphism trong lập trình hướng đối tượng OOP cho phép một Object có thể có nhiều hình dạng và hành vi khác nhau.

Polymorphism trong OOP được chia làm 2 loại:

  • Static Polymorphism (đa hình tĩnh): là cơ chế định nghĩa lại các methods cùng tên, nhưng có thể khác số lượng hoặc kiểu của tham số. Static Polymorphism còn được gọi là Method Overloading.
  • Dynamic Polymorphism (đa hình động): là cơ chế định nghĩa lại các methods cùng tên, cùng tham số và kiểu trả về từ parent class. Dynamic Polymorphism còn được gọi là Method Overriding.

Sự khác biệt lớn nhất giữa Static và Dynamic Polymorphism là: Static Polymorphism được xử lý tại thời điểm biên dịch (compile-time). Dynamic Polymorphism được xử lý tại thời điểm chạy chương trình (runtime).

Ví dụ với Overriding:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # Phương thức để hiển thị thông tin cá nhân
    def get_details(self):
        return f"Name: {self.name}, Age: {self.age}"

class Student(Person):
    def __init__(self, name, age, student_id):
        super().__init__(name, age)
        self.student_id = student_id

    # Ghi đè phương thức get_details
    def get_details(self):
        return f"Student ID: {self.student_id}, {super().get_details()}"

# Hàm để hiển thị thông tin của một Person hoặc Student
def print_person_details(person):
    print(person.get_details())

# Khởi tạo đối tượng Person và Student
person = Person('Alice', 30)
student = Student('Bob', 20, 'S98765')

Trong ví dụ này:

  • Cả Person và Student đều có phương thức get_details(). Phương thức này được ghi đè trong Student để bổ sung thông tin về student_id.
  • Hàm print_person_details có thể nhận đối tượng của cả hai lớp Person và Student (minh họa tính đa hình): mặc dù nó gọi cùng một phương thức get_details(), nhưng kết quả tùy thuộc vào loại đối tượng được truyền vào.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí