Python - Lớp và Đối Tượng

Xin chào các bạn nhà lập trình Python mới nhảy! Hôm nay, chúng ta sẽ bắt đầu cuộc hành trình thú vị vào thế giới Lập Trình Hướng Đối Tượng (OOP) trong Python. Hãy cúi đôi vào ghế, vì chúng ta sắp thay đổi cách bạn suy nghĩ về mã lệnh!

Python - Classes & Objects

Lớp là gì trong Python?

Hãy tưởng tượng bạn đang xây dựng một cỏ bản siêu thực. Bạn sẽ không tạo mỗi loài động vật từ đầu mới, phải không? Đó là nơi lớp đến vai trò quan trọng!

Một lớp trong Python giống như một bản kế hoạch hoặc mẫu để tạo ra các đối tượng. Nó xác định một tập hợp các thuộc tính và phương thức mà các đối tượng của lớp đó sẽ có.

Hãy tạo một lớp đơn giản để đại diện cho một chú chó:

class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed

def bark(self):
print(f"{self.name} nói Woof!")

Trong ví dụ này, Dog là lớp của chúng ta. Nó có các thuộc tính như namebreed, và một phương thức có tên là bark().

Tạo Lớp trong Python

Việc tạo một lớp chỉ cần sử dụng từ khóa class theo sau là tên lớp. Hãy tạo một lớp Car chi tiết hơn:

class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer = 0

def drive(self, distance):
self.odometer += distance
print(f"Đã lái {distance} dặm. Tổng: {self.odometer} dặm")

def honk(self):
print("Beep beep!")

Ở đây, __init__ là một phương thức đặc biệt được gọi là hàm khởi tạo. Nó được gọi khi chúng ta tạo một đối tượng mới của lớp này.

Đối tượng là gì?

Nếu lớp là bản kế hoạch, đối tượng là "đồ vật" thực tế được tạo ra từ bản kế hoạch đó. Nó là một thể hiện cụ thể của một lớp.

Tạo Đối Tượng của Lớp trong Python

Việc tạo một đối tượng (cũng được gọi là khởi tạo) giống như sử dụng bản kế hoạch của chúng ta để tạo ra một điều gì đó thực tế. Hãy tạo một số chiếc car:

my_car = Car("Toyota", "Corolla", 2020)
your_car = Car("Honda", "Civic", 2019)

print(my_car.make)  # Output: Toyota
your_car.drive(50)  # Output: Đã lái 50 dặm. Tổng: 50 dặm
my_car.honk()  # Output: Beep beep!

Mỗi chiếc car là một đối tượng riêng biệt với một tập hợp các thuộc tính và phương thức của riêng nó.

Truy Cập Các Thuộc Tính của Đối Tượng trong Python

Chúng ta có thể truy cập các thuộc tính của một đối tượng bằng cách sử dụng dấu chấm. Hãy kiểm tra chiếc car của chúng ta:

print(f"Chiếc car của tôi là một {my_car.year} {my_car.make} {my_car.model}")
# Output: Chiếc car của tôi là một 2020 Toyota Corolla

Các Thuộc Tính Độc Quyền của Lớp trong Python

Python lớp có một số thuộc tính độc quyền. Hãy khám phá chúng:

class MyClass:
x = 5

print(MyClass.__name__)  # Output: MyClass
print(MyClass.__module__)  # Output: __main__
print(MyClass.__dict__)  # Output: {'__module__': '__main__', 'x': 5, ...}

Lớp Độc Quyền của Các Kiểu Dữ Liệu Python

Bạn có biết rằng ngay cả các kiểu dữ liệu cơ bản của Python cũng là các đối tượng? Hãy kiểm tra nó:

print(type(5))  # Output: <class 'int'>
print(type("Hello"))  # Output: <class 'str'>
print(type([1, 2, 3]))  # Output: <class 'list'>

Mọi thứ trong Python đều là một đối tượng!

Thu Hồi Động Cơ (Đánh Dấu Đối Tượng) trong Python

Trong Python, chúng ta không cần phải tự đánh dấu đối tượng. Bộ thu hồi rác của Python sẽ tự động quản lý khi một đối tượng không còn được sử dụng.

import gc

# Tạo một đối tượng
my_car = Car("Toyota", "Corolla", 2020)

# Xóa tham chiếu
my_car = None

# Ép buộc thu hồi rác (thường không cần thiết)
gc.collect()

Ẩn Thông Tin trong Python

Trong OOP, chúng ta thường muốn kiểm soát quyền truy cập vào một số thuộc tính. Python sử dụng quy ước tiền tố các thuộc tính bằng dấu gạch dưới:

class BankAccount:
def __init__(self, balance):
self._balance = balance  # Thuộc tính được bảo vệ
self.__secret = "shh"  # Thuộc tính riêng tư

def deposit(self, amount):
self._balance += amount

def get_balance(self):
return self._balance

account = BankAccount(1000)
print(account._balance)  # Output: 1000 (nhưng chúng ta không nên làm điều này!)
print(account.__secret)  # Điều này sẽ gây ra một AttributeError

Dưới đây là bảng tóm tắt các phương thức mà chúng ta đã conver:

Phương thức Mô tả
__init__(self, ...) Phương thức khởi tạo, được gọi khi tạo một đối tượng mới
__str__(self) Trả về một chuỗi biểu diễn của đối tượng
__repr__(self) Trả về một chuỗi biểu diễn chi tiết của đối tượng
__len__(self) Xác định hành vi cho hàm len()
__getitem__(self, key) Xác định hành vi cho các thao tác lấy phần tử
__setitem__(self, key, value) Xác định hành vi cho việc gán giá trị cho các phần tử được chỉ định

Và đó là thế! Bạn đã bước ra đầu tiên vào thế giới Lập Trình Hướng Đối Tượng trong Python. Hãy nhớ, luyện tập sẽ làm bạn hoàn hảo. Thử tạo ra các lớp và đối tượng của riêng bạn, và sớm bạn sẽ có thể xây dựng các chương trình phức tạp và hiệu quả như một chuyên gia!

Credits: Image by storyset