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

Lập trình hướng đối tượng (OOP) là một phương pháp lập trình dựa trên việc sử dụng các đối tượng và lớp. Python hỗ trợ OOP và có thể sử dụng các khái niệm như lớp, đối tượng, kế thừa, đa hình, và đóng gói.

  1. Lớp (Class) và Đối tượng (Object)
  2. Phương thức khởi tạo (__init__)
  3. Kế thừa (Inheritance)
  4. Đa hình (Polymorphism)
  5. Đóng gói (Encapsulation)
  6. Tóm tắt các khái niệm chính trong OOP
  7. Video thực hành về lập trình hướng đối tượng

Dưới đây là một hướng dẫn chi tiết về lập trình hướng đối tượng trong Python.

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

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

Lớp (Class)

Lớp là một bản thiết kế (template) cho các đối tượng. Nó định nghĩa các thuộc tính (attributes) và phương thức (methods) mà đối tượng của lớp đó sẽ có.

Đối tượng (Object)

Đối tượng là một thực thể cụ thể của một lớp. Một lớp có thể tạo ra nhiều đối tượng khác nhau.
Cú pháp tạo lớp trong Python:

class ClassName:
    def __init__(self, param1, param2):
        # Khởi tạo các thuộc tính của đối tượng
        self.param1 = param1
        self.param2 = param2

    def method_name(self):
        # Các phương thức (hành vi) của đối tượng
        print("Đây là một phương thức trong lớp.")

 

Ví dụ cơ bản về lớp và đối tượng

# Định nghĩa lớp
class Person:
    def __init__(self, name, age):
        self.name = name  # Thuộc tính tên
        self.age = age    # Thuộc tính tuổi

    def introduce(self):
        print(f"Chào, tôi là {self.name} và tôi {self.age} tuổi.")

# Tạo đối tượng từ lớp Person
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)

# Gọi phương thức của đối tượng
person1.introduce()
person2.introduce()


Kết quả:


Chào, tôi là Alice và tôi 25 tuổi.
Chào, tôi là Bob và tôi 30 tuổi.

Ví dụ giải phương trình bậc 1 theo hướng đối tượng Python

# đối tượng có tên GPTB1
# có 2 thuộc tính a,b
# __int__ là phương thức khởi tạo
class GPTB1:
    def __init__(self,a,b):
        self.a=a
        self.b=b

    def giai(self):
        if self.a == 0:
            print("Nhập số a khác 0")
        else:
            x= - self.b / self.a
            print("Nghiệm x là:" + str(x))
            
gpt_lan1 = GPTB1(4,2)       
gpt_lan1.giai();

self là gì ?

    Tham chiếu đến đối tượng hiện tại:
        Khi bạn tạo một đối tượng (object) từ một lớp

   ví dụ:
doi_tuong = TenLop()

    self sẽ tham chiếu đến chính đối tượng doi_tuong đó.
    Bên trong các phương thức của lớp, bạn sử dụng self để truy cập và thay đổi các thuộc tính (attribute) của đối tượng.

2. Phương thức khởi tạo (__init__)

Phương thức __init__ trong Python là phương thức đặc biệt, được gọi tự động khi bạn tạo đối tượng từ lớp. Nó được dùng để khởi tạo các thuộc tính của đối tượng.

Ví dụ:

class Car:
    def __init__(self, brand, model, year):
        self.brand = brand
        self.model = model
        self.year = year

    def display_info(self):
        print(f"{self.year} {self.brand} {self.model}")

# Tạo đối tượng từ lớp Car
car1 = Car("Toyota", "Corolla", 2020)
car1.display_info()

Kết quả:

2020 Toyota Corolla

3. Kế thừa (Inheritance)

Kế thừa là một tính năng trong OOP cho phép một lớp con (child class) kế thừa các thuộc tính và phương thức của lớp cha (parent class). Kế thừa giúp tái sử dụng mã nguồn và giảm thiểu sự lặp lại.
Cú pháp kế thừa trong Python:

class ChildClass(ParentClass):
    def __init__(self, param1, param2):
        super().__init__(param1, param2)  # Gọi phương thức khởi tạo của lớp cha
        # Các thuộc tính và phương thức riêng của lớp con


Ví dụ kế thừa:

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(f"{self.name} makes a sound")

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # Gọi phương thức khởi tạo của lớp cha
        self.breed = breed

    def speak(self):
        print(f"{self.name} barks")

# Tạo đối tượng từ lớp Dog
dog1 = Dog("Buddy", "Golden Retriever")
dog1.speak()


Kết quả:

Buddy barks

Ở đây, lớp Dog kế thừa từ lớp Animal và có phương thức speak() riêng của mình.

4. Đa hình (Polymorphism)

Đa hình cho phép một đối tượng của lớp con có thể thay thế đối tượng của lớp cha mà không làm thay đổi hành vi của chương trình. Thực tế, đa hình trong OOP chủ yếu thông qua việc ghi đè phương thức (method overriding).
Ví dụ về đa hình:

class Animal:
    def speak(self):
        print("Animal makes a sound")

class Dog(Animal):
    def speak(self):
        print("Dog barks")

class Cat(Animal):
    def speak(self):
        print("Cat meows")

# Tạo các đối tượng
animals = [Dog(), Cat()]

# Gọi phương thức speak() trên mỗi đối tượng
for animal in animals:
    animal.speak()


Kết quả:

Dog barks
Cat meows

Ở đây, phương thức speak() được ghi đè trong cả lớp Dog và Cat, nhưng khi gọi phương thức speak() qua danh sách animals, mỗi đối tượng sử dụng phương thức riêng của nó.

5. Đóng gói (Encapsulation)

Đóng gói là một nguyên lý trong OOP, trong đó các thuộc tính và phương thức của lớp được bảo vệ khỏi sự truy cập trực tiếp từ bên ngoài. Điều này giúp ẩn thông tin (information hiding), chỉ cho phép truy cập thông qua các phương thức công khai.
Ví dụ về đóng gói:

class BankAccount:
    def __init__(self, owner, balance):
        self.owner = owner
        self.__balance = balance  # __balance là thuộc tính private, không thể truy cập từ bên ngoài

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"Đã gửi {amount}. Số dư hiện tại là {self.__balance}")
        else:
            print("Số tiền gửi phải lớn hơn 0.")

    def withdraw(self, amount):
        if amount > 0 and amount <= self.__balance:
            self.__balance -= amount
            print(f"Đã rút {amount}. Số dư hiện tại là {self.__balance}")
        else:
            print("Không đủ số dư hoặc số tiền rút không hợp lệ.")

    def get_balance(self):
        return self.__balance

# Tạo đối tượng BankAccount
account = BankAccount("Alice", 1000)
account.deposit(500)
account.withdraw(200)

# Truy cập thông qua phương thức công khai
print(f"Số dư tài khoản là: {account.get_balance()}")


Kết quả:

Đã gửi 500. Số dư hiện tại là 1500
Đã rút 200. Số dư hiện tại là 1300
Số dư tài khoản là: 1300

Ở đây, thuộc tính __balance là thuộc tính private và không thể truy cập trực tiếp từ bên ngoài lớp. Tuy nhiên, ta có thể thay đổi hoặc lấy giá trị của nó thông qua các phương thức công khai như deposit(), withdraw(), và get_balance().

6. Tóm tắt các khái niệm chính trong OOP

    Lớp (Class): Bản thiết kế cho đối tượng.
    Đối tượng (Object): Thực thể cụ thể của lớp.
    Kế thừa (Inheritance): Cho phép lớp con kế thừa thuộc tính và phương thức từ lớp cha.
    Đa hình (Polymorphism): Cho phép lớp con thay đổi hành vi của phương thức lớp cha.
    Đóng gói (Encapsulation): Ẩn thông tin và cho phép truy cập thông qua các phương thức công khai.

7. Video thực hành về lập trình hướng đối tượng

Tính tổng

Lập trình hướng đối tượng (OOP) là một phương pháp lập trình dựa trên việc sử dụng các đối tượng và lớp. Python hỗ trợ OOP và có thể sử dụng các khái niệm như lớp, đối tượng, kế thừa, đa hình, và đóng gói.