Đóng gói trong Python
Category: Python
Trong Python, đóng gói đề cập đến việc đóng gói dữ liệu (thuộc tính) và phương thức (hàm) hoạt động trên dữ liệu thành một đơn vị duy nhất, thường là một lớp. Nó cũng hạn chế quyền truy cập trực tiếp vào một số thành phần, giúp bảo vệ tính toàn vẹn của dữ liệu và đảm bảo sử dụng đúng cách.
Mục lục
Đóng gói trong Python
Ví dụ về đóng gói
Thành viên công cộng
Thành viên được bảo vệ
Thành viên riêng tư
Đóng gói là quá trình ẩn trạng thái bên trong của một đối tượng và yêu cầu tất cả các tương tác phải được thực hiện thông qua các phương thức của đối tượng. Cách tiếp cận này:
Cung cấp khả năng kiểm soát dữ liệu tốt hơn.
Ngăn chặn việc sửa đổi dữ liệu một cách ngẫu nhiên.
Thúc đẩy lập trình mô-đun.
Python thực hiện đóng gói thông qua các thuộc tính public , protected và private .
Cách thức hoạt động của đóng gói:
Ẩn dữ liệu : Các biến (thuộc tính) được giữ riêng tư hoặc được bảo vệ, nghĩa là chúng không thể truy cập trực tiếp từ bên ngoài lớp. Thay vào đó, chúng chỉ có thể được truy cập hoặc sửa đổi thông qua các phương thức.
Truy cập thông qua Phương thức : Phương thức hoạt động như giao diện mà qua đó mã bên ngoài tương tác với dữ liệu được lưu trữ trong các biến. Ví dụ, getter và setter là các phương thức phổ biến được sử dụng để truy xuất và cập nhật giá trị của một biến riêng tư.
Kiểm soát và Bảo mật : Bằng cách đóng gói các biến và chỉ cho phép thao tác chúng thông qua các phương thức, lớp có thể thực thi các quy tắc về cách truy cập hoặc sửa đổi các biến, do đó duy trì khả năng kiểm soát và bảo mật đối với dữ liệu.
Ví dụ về đóng gói
Đóng gói trong Python giống như có một hệ thống tài khoản ngân hàng, nơi số dư tài khoản (dữ liệu) của bạn được giữ riêng tư. Bạn không thể trực tiếp thay đổi số dư của mình bằng cách truy cập vào cơ sở dữ liệu tài khoản. Thay vào đó, ngân hàng cung cấp cho bạn các phương thức (hàm) như gửi tiền và rút tiền để sửa đổi số dư của bạn một cách an toàn.
Dữ liệu riêng tư (Số dư) : Số dư của bạn được lưu trữ an toàn. Không được phép truy cập trực tiếp từ bên ngoài, đảm bảo dữ liệu được bảo vệ khỏi những thay đổi trái phép.
Phương pháp công khai (Gửi và Rút tiền) : Đây là cách duy nhất để sửa đổi số dư của bạn. Họ kiểm tra xem yêu cầu của bạn (như rút tiền) có tuân theo các quy tắc hay không (ví dụ: bạn có đủ số dư) trước khi cho phép thay đổi.
Thành viên công cộng
Các thành viên công khai có thể truy cập từ bất kỳ đâu, cả bên trong và bên ngoài lớp. Đây là các thành viên mặc định trong Python.
Ví dụ:
class Public:
def __init__(self):
self.name = "John" # Thuộc tính công khai (public)
def display_name(self):
print(self.name) # Phương thức công khai (public)
obj = Public()
obj.display_name() # Có thể truy cập được
print(obj.name) # Có thể truy cập được
Giải thích:
Thuộc tính công khai (tên): Thuộc tính này được khai báo mà không có bất kỳ tiền tố gạch dưới nào. Thuộc tính này có thể truy cập từ bất kỳ đâu, cả bên trong và bên ngoài lớp.
Phương thức công khai (display_name): Phương thức này cũng có thể truy cập được từ bất kỳ phần nào của mã. Nó truy cập trực tiếp vào thuộc tính công khai và in giá trị của thuộc tính đó.
Đối tượng (obj): Một thể hiện của Public được tạo ra và phương thức display_name được gọi, chứng minh cách các thuộc tính và phương thức public có thể được truy cập trực tiếp.
Lưu ý: Phương thức init là một hàm tạo và chạy ngay khi đối tượng của lớp được khởi tạo.
Thành viên được bảo vệ
Các thành viên được bảo vệ được xác định bằng một dấu gạch dưới (_) . Chúng chỉ được truy cập trong lớp hoặc các lớp con của lớp đó.
Ví dụ:
class Protected:
def __init__(self):
self._age = 30 # Thuộc tính được bảo vệ
class Subclass(Protected):
def display_age(self):
print(self._age) # Có thể truy cập trong lớp con
obj = Subclass()
obj.display_age()
Giải thích:
Thuộc tính được bảo vệ (_age): Thuộc tính này được thêm tiền tố là một dấu gạch dưới đơn, theo quy ước, cho thấy rằng nó nên được coi là thành viên được bảo vệ. Nó không được Python áp dụng nhưng chỉ ra rằng nó không nên được truy cập bên ngoài lớp này và các lớp con của nó.
Lớp con: Ở đây, một lớp con kế thừa từ Protected. Trong lớp con này, chúng ta vẫn có thể truy cập thuộc tính protected _age .
Phương thức (display_age): Phương thức này trong lớp con truy cập thuộc tính protected và in giá trị của nó. Điều này cho thấy các thành viên protected có thể được truy cập trong lớp và các lớp con của nó.
Thành viên riêng tư
Các thành viên riêng tư được xác định bằng dấu gạch dưới kép (__) và không thể truy cập trực tiếp từ bên ngoài lớp. Python sử dụng phương pháp đổi tên để làm cho các thành viên riêng tư không thể truy cập được bằng cách đổi tên chúng bên trong.
Lưu ý: Các thành viên private và protected của Python có thể được truy cập bên ngoài lớp thông qua việc thay đổi tên python .
class Private:
def __init__(self):
self.__salary = 50000 # Thuộc tính riêng tư
def salary(self):
return self.__salary # Truy cập thông qua phương thức public
obj = Private()
print(obj.salary()) # Hoạt động
#print(obj.__salary) # Tăng AttributeError
Giải thích:
Thuộc tính riêng tư (__salary): Thuộc tính này được thêm tiền tố là hai dấu gạch dưới, khiến nó trở thành thành viên riêng tư. Python thực thi quyền riêng tư bằng cách thay đổi tên, nghĩa là nó đổi tên thuộc tính theo cách khiến nó khó truy cập từ bên ngoài lớp.
Phương thức (salary): Phương thức công khai này cung cấp cách duy nhất để truy cập thuộc tính riêng tư từ bên ngoài lớp. Nó trả về giá trị __salary một cách an toàn.
Cố gắng truy cập trực tiếp: Cố gắng truy cập trực tiếp vào thuộc tính riêng tư (obj.__salary) sẽ dẫn đến lỗi AttributeError, cho biết rằng quyền truy cập trực tiếp đã bị chặn. Đây là cách Python thực thi đóng gói ở cấp độ ngôn ngữ.
Published on Jun 20, 2025