Access Modifiers là các từ khóa trong các ngôn ngữ lập trình hướng đối tượng (OOP) được sử dụng để thiết lập quyền truy cập của các lớp, phương thức và các thành viên khác. Trong Python, mặc dù không có các từ khóa như public
, private
, và protected
như trong các ngôn ngữ khác (ví dụ: Java, C++), nhưng Python vẫn cung cấp các cách để mô phỏng các Access Modifiers này thông qua các quy ước đặt tên.
Các loại Access Modifiers trong Python
Python cung cấp ba loại Access Modifiers chính:
- Public: Các thành viên có thể được truy cập từ bất kỳ đâu.
- Protected: Các thành viên chỉ có thể được truy cập từ bên trong lớp và các lớp con.
- Private: Các thành viên chỉ có thể được truy cập từ bên trong lớp.
Public Access Modifier
Các thành viên của lớp được khai báo là public có thể được truy cập từ bất kỳ đâu trong chương trình. Mặc định, tất cả các biến và phương thức trong một lớp Python đều là public nếu không có quy ước đặt tên đặc biệt.
Ví dụ:
python
class Student:
def __init__(self, name, age):
self.name = name # public attribute
self.age = age # public attribute
def display(self):
print(f"Name: {self.name}, Age: {self.age}")
# Tạo đối tượng của lớp Student
student = Student("John", 20)
# Truy cập các thuộc tính public
print(student.name) # Kết quả: John
print(student.age) # Kết quả: 20
# Gọi phương thức public
student.display() # Kết quả: Name: John, Age: 20
Protected Access Modifier
Các thành viên của lớp được khai báo là protected chỉ có thể được truy cập từ bên trong lớp và các lớp con. Trong Python, các thành viên protected được định nghĩa bằng cách thêm một dấu gạch dưới _
trước tên biến hoặc phương thức.
Ví dụ:
python
class Person:
def __init__(self, name, age):
self._name = name # protected attribute
self._age = age # protected attribute
def _display(self): # protected method
print(f"Name: {self._name}, Age: {self._age}")
class Student(Person):
def __init__(self, name, age, roll_number):
super().__init__(name, age)
self._roll_number = roll_number # protected attribute
def display(self):
self._display()
print(f"Roll Number: {self._roll_number}")
# Tạo đối tượng của lớp Student
student = Student("John", 20, 123)
# Truy cập các thuộc tính protected từ lớp con
student.display()
Kết quả:
Name: John, Age: 20
Roll Number: 123
Private Access Modifier
Các thành viên của lớp được khai báo là private chỉ có thể được truy cập từ bên trong lớp. Trong Python, các thành viên private được định nghĩa bằng cách thêm hai dấu gạch dưới __
trước tên biến hoặc phương thức. Python sử dụng cơ chế "name mangling" để thay đổi tên của các thành viên private, giúp ngăn chặn truy cập từ bên ngoài lớp.
Ví dụ:
python
class Employee:
def __init__(self, name, salary):
self.__name = name # private attribute
self.__salary = salary # private attribute
def __display(self): # private method
print(f"Name: {self.__name}, Salary: {self.__salary}")
def show(self):
self.__display()
# Tạo đối tượng của lớp Employee
employee = Employee("Alice", 50000)
# Truy cập các thuộc tính private từ bên trong lớp
employee.show() # Kết quả: Name: Alice, Salary: 50000
# Truy cập các thuộc tính private từ bên ngoài lớp sẽ gây lỗi
# print(employee.__name) # AttributeError
# print(employee.__salary) # AttributeError
Truy cập các thành viên private từ bên ngoài lớp
Mặc dù Python không cho phép truy cập trực tiếp vào các thành viên private từ bên ngoài lớp, nhưng bạn vẫn có thể truy cập chúng thông qua cơ chế "name mangling". Tên của các thành viên private được thay đổi thành _ClassName__memberName
.
Ví dụ:
python
class Employee:
def __init__(self, name, salary):
self.__name = name # private attribute
self.__salary = salary # private attribute
def show(self):
print(f"Name: {self.__name}, Salary: {self.__salary}")
# Tạo đối tượng của lớp Employee
employee = Employee("Alice", 50000)
# Truy cập các thuộc tính private thông qua name mangling
print(employee._Employee__name) # Kết quả: Alice
print(employee._Employee__salary) # Kết quả: 50000
Getter và Setter
Getter và Setter là các phương thức được sử dụng để truy cập và cập nhật các thuộc tính private của một lớp. Chúng giúp bảo vệ dữ liệu và kiểm soát cách dữ liệu được truy cập và thay đổi.
Ví dụ:
python
class Employee:
def __init__(self, name, salary):
self.__name = name # private attribute
self.__salary = salary # private attribute
# Getter cho thuộc tính name
def get_name(self):
return self.__name
# Setter cho thuộc tính name
def set_name(self, name):
self.__name = name
# Getter cho thuộc tính salary
def get_salary(self):
return self.__salary
# Setter cho thuộc tính salary
def set_salary(self, salary):
if salary > 0:
self.__salary = salary
else:
print("Invalid salary")
# Tạo đối tượng của lớp Employee
employee = Employee("Alice", 50000)
# Sử dụng getter để truy cập các thuộc tính private
print(employee.get_name()) # Kết quả: Alice
print(employee.get_salary()) # Kết quả: 50000
# Sử dụng setter để cập nhật các thuộc tính private
employee.set_name("Bob")
employee.set_salary(60000)
print(employee.get_name()) # Kết quả: Bob
print(employee.get_salary()) # Kết quả: 60000
Kết luận
Access Modifiers là một phần quan trọng của lập trình hướng đối tượng, giúp kiểm soát quyền truy cập vào các thành viên của lớp và bảo vệ dữ liệu. Mặc dù Python không có các từ khóa Access Modifiers như các ngôn ngữ khác, nhưng Python cung cấp các quy ước đặt tên để mô phỏng các Access Modifiers này. Bằng cách sử dụng các quy ước này, bạn có thể kiểm soát quyền truy cập vào các thành viên của lớp và bảo vệ dữ liệu của mình một cách hiệu quả.