Khóa học python

Access Modifiers trong Python

0 phút đọc

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:

  1. Public: Các thành viên có thể được truy cập từ bất kỳ đâu.
  2. 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.
  3. 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ụ:

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ụ:

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ụ:

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ụ:

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ụ:

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ả.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Liệt kê các kiểu dữ liệu trong Python?

entry

Biến cục bộbiến toàn cục trong Python là gì?

entry

Trong Python có những built-in types nào?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào