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 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 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.")
# Đị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()
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();
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.
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
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
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()
Đ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()
Đó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()}")
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.
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.