PHP
Python

Trang chủ

Tìm hiểu về Access Modifiers trong Python

Ngôn ngữ Python là một ngôn ngữ lập trình đa mục đích, nổi tiếng với cú pháp dễ đọc, dễ học và tính ứng dụng cao. Trong lĩnh vực phát triển web, Python thường được sử dụng thông qua các framework như Django và Flask để xây dựng các ứng dụng web mạnh mẽ, bảo mật và dễ mở rộng. Trong chuyên mục này, Vietnix không chỉ cung cấp kiến thức nền tảng về ngôn ngữ Python mà còn hướng dẫn chi tiết cách xây dựng các ứng dụng web thực tế, sử dụng các framework phổ biến và áp dụng các kỹ thuật tiên tiến. Vietnix cam kết liên tục cập nhật những bài viết mới nhất về các tính năng mới của Python, các thư viện hỗ trợ hữu ích và những phương pháp tốt nhất, giúp bạn khai thác tối đa sức mạnh của Python và hoàn thiện kỹ năng lập trình web của mình.
html
CSS
javascript
sql
python
php
c
c++
bootstrap
react
mysql
reactjs
vuejs
Javascript Tutorials
10/03/2025
17 phút đọc
Theo dõi Vietnix trên

Tìm hiểu về Access Modifiers trong Python

Access Modifiers trong Python (bộ điều chỉnh truy cập) là các cơ chế kiểm soát quyền truy cập vào thuộc tính và phương thức của một lớp, bao gồm public, protected private. Việc sử dụng Access Modifiers giúp bảo vệ dữ liệu, ngăn chặn truy cập trái phép và đảm bảo tính đóng gói trong lập trình hướng đối tượng. Trong bài viết này, mình sẽ giới thiệu chi tiết về Access Modifiers trong Python cũng như cách sử dụng hiệu quả.

Những điểm chính

  • Khái niệm: Hiểu được Access Modifiers là gì và cách chúng kiểm soát quyền truy cập vào thuộc tính, phương thức trong lớp.
  • Tổng quan về Access Modifiers trong Python: Nắm được ba loại Access Modifiers là public, protected, private và cách sử dụng chúng qua các ví dụ thực tế.
  • Quá trình thay đổi tên – Name Mangling: Biết cách Python xử lý thuộc tính private bằng kỹ thuật name mangling để tránh xung đột tên.
  • Python Property Object: Hiểu rõ property object trong Python, cú pháp sử dụng và các tham số quan trọng khi định nghĩa property.
  • Getters và Setters trong Python: Tìm hiểu cách sử dụng getters và setters để kiểm soát việc truy cập và cập nhật giá trị của thuộc tính trong lớp.
  • Vietnix – Nhà cung cấp dịch vụ lưu trữ tốc độ cao: Biết thêm về Vietnix, đơn vị cung cấp web hosting và VPS chất lượng cao, giúp tối ưu hiệu suất website.
  • Câu hỏi thường gặp: Giải đáp các thắc mắc về Access Modifiers trong Python dành cho người mới.

Access Modifiers trong Python là gì?

Access Modifiers trong Python được sử dụng để giới hạn quyền truy cập vào các thành viên của lớp (bao gồm biến và phương thức) từ bên ngoài lớp. Python có ba loại Access Modifiers chính:

  • Public Members: 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.
  • Protected Members: Các thành viên protected có thể được truy cập từ bên trong lớp và các lớp kế thừa từ lớp đó.
  • Private Members: Các thành viên private chỉ có thể được truy cập bên trong chính lớp đó.
Access Modifiers trong Python được sử dụng để giới hạn quyền truy cập vào các thành viên của lớp
Access Modifiers trong Python được sử dụng để giới hạn quyền truy cập vào các thành viên của lớp

Thông thường, các phương thức trong lớp sẽ được khai báo là public, trong khi các biến instance thường là private. Cách tổ chức này giúp đảm bảo nguyên tắc đóng gói (encapsulation), bảo vệ dữ liệu khỏi việc bị thay đổi ngoài ý muốn.

Tổng quan về Access Modifiers trong Python

Không giống như C++ và Java, Python không sử dụng các từ khóa public, protected, và private để xác định các mức độ truy cập (access modifiers). Mặc định, tất cả các biến và phương thức trong một lớp Python đều có phạm vi truy cập công khai (public). Trong Python, nếu một biến hoặc phương thức không có dấu gạch dưới (_), nó được coi là public. Điều này có nghĩa là nó có thể được truy cập trực tiếp từ bên ngoài lớp.

Ví dụ 1

Giả sử, bạn có một lớp HostingPlan đại diện cho các gói dịch vụ hosting:

class HostingPlan:
    """Lớp đại diện cho một gói hosting"""
    def __init__(self, name, storage):
        self.name = name  # Public variable
        self.storage = storage  # Public variable
plan1 = HostingPlan("Vietnix NVMe", "50GB")
plan2 = HostingPlan("Vietnix Business", "100GB")
print("Gói hosting:", plan1.name, "- Dung lượng:", plan1.storage)
print("Gói hosting:", plan2.name, "- Dung lượng:", plan2.storage)
  • Kết quả:

Gói hosting: Vietnix NVMe – Dung lượng: 50GB
Gói hosting: Vietnix Business – Dung lượng: 100GB

Ví dụ 2

Để chỉ định một biến hoặc phương thức là protected, Python sử dụng một dấu gạch dưới (_) trước tên biến. Biến protected có thể được truy cập từ bên trong lớp và các lớp kế thừa, nhưng theo quy ước, không nên truy cập trực tiếp từ bên ngoài.

class Server:
    def __init__(self, name, location):
        self.name = name  # Public
        self._location = location  # Protected
server1 = Server("Vietnix VPS", "Hà Nội")
print(server1.name)  # Truy cập được
print(server1._location)  # Truy cập được nhưng không khuyến khích

Nếu muốn một biến hoặc phương thức chỉ có thể truy cập từ bên trong lớp, bạn sử dụng hai dấu gạch dưới (__) trước tên biến. Python không cho phép truy cập trực tiếp vào biến private từ bên ngoài.

class Firewall:
    def __init__(self, rule_name, security_level):
        self.rule_name = rule_name  # Public
        self.__security_level = security_level  # Private
firewall1 = Firewall("Anti-DDoS", "Cao")
print(firewall1.rule_name)  # Truy cập được
print(firewall1.__security_level)  # Lỗi
  • Khi chạy chương trình sẽ báo lỗi:

AttributeError: ‘Firewall’ object has no attribute ‘__security_level’

Python không có từ khóa xác định public, protectedprivate, nhưng sử dụng quy ước đặt tên với dấu gạch dưới để mô phỏng cơ chế kiểm soát truy cập. Hiểu rõ cách hoạt động của các access modifiers giúp lập trình viên viết code an toàn và dễ bảo trì hơn, đặc biệt khi làm việc với các hệ thống phức tạp.

Quá trình thay đổi tên – Name Mangling

Python không chặn hoàn toàn quyền truy cập vào dữ liệu riêng tư (private), mà chỉ khuyến khích lập trình viên không truy cập chúng từ bên ngoài lớp. Tuy nhiên, vẫn có thể truy cập các thành viên private bằng kỹ thuật name mangling. Trong đó, Name mangling là quá trình Python tự động thay đổi tên của các biến hoặc phương thức có hai dấu gạch dưới đầu tiên (__). Cụ thể, chúng sẽ được chuyển thành dạng:

object._ClassName__VariableName

Điều này giúp hạn chế việc vô tình truy cập dữ liệu riêng tư từ bên ngoài lớp. Tuy nhiên, trong trường hợp cần thiết, lập trình viên vẫn có thể truy cập bằng cách sử dụng tên đã được chuyển đổi. Dưới đây, bạn hãy xem xét lớp Employee với một biến private __age:

class Employee:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # Biến private

e1 = Employee("Nam", 24)

Thông thường, nếu cố gắng truy cập e1.__age, Python sẽ báo lỗi. Tuy nhiên, bạn có thể sử dụng name mangling để truy cập biến này:

print(e1._Employee__age)  # Kết quả: 24

Dù kỹ thuật này cho phép truy cập biến private, nhưng đây không phải là cách làm khuyến khích, vì nó có thể gây ảnh hưởng đến tính bảo mật và tính đóng gói của chương trình.

Python Property Object

Python cung cấp hàm property() trong thư viện chuẩn, giúp tạo một property object để kiểm soát quyền truy cập vào biến của một lớp. Đây là một cách để tạo interface giữa các biến nội bộ và các thao tác bên ngoài lớp. Trong lập trình hướng đối tượng (OOP), nguyên tắc đóng gói yêu cầu rằng các biến nội bộ của một lớp nên được bảo vệ và không thể truy cập trực tiếp từ bên ngoài. Python không có từ khóa private như một số ngôn ngữ khác, vì vậy property() là một giải pháp thay thế để kiểm soát quyền truy cập vào các biến này.

  • Cú pháp:
property(fget=None, fset=None, fdel=None, doc=None)

Trong đó:

  • fget – Phương thức getter để lấy giá trị của biến.
  • fset – Phương thức setter để gán giá trị cho biến.
  • fdel – Phương thức xóa biến.
  • doc – Chuỗi tài liệu (docstring) cho property.

Giả sử, bạn muốn quản lý thông tin tài khoản khách hàng, trong đó một số thông tin cần được bảo vệ và chỉ có thể truy cập gián tiếp thông qua các phương thức hợp lệ. Dưới đây là cách sử dụng property() để đảm bảo tính bảo mật:

class Customer:
    def __init__(self, name, email):
        self._name = name  # Biến nội bộ
        self._email = email  
    # Getter method
    def get_email(self):
        return self._email
    # Setter method (chỉ cho phép cập nhật email với điều kiện hợp lệ)
    def set_email(self, new_email):
        if "@" in new_email:
            self._email = new_email
        else:
            raise ValueError("Email không hợp lệ!")
    # Xóa email (trong trường hợp khách hàng yêu cầu xóa dữ liệu)
    def del_email(self):
        print("Email đã được xóa.")
        self._email = None  
    email = property(get_email, set_email, del_email, "Quản lý email khách hàng")
# Sử dụng class
customer = Customer("Nguyễn Văn A", "a@example.com")
print(customer.email)  # Lấy email
customer.email = "newmail@vietnix.vn"  # Cập nhật email hợp lệ
print(customer.email)
del customer.email  # Xóa email
print(customer.email)  # Kết quả: None

Lợi ích của property():

  • Kiểm soát truy cập dữ liệu: Giúp ngăn chặn việc thay đổi trực tiếp giá trị của biến nội bộ.
  • Bảo vệ dữ liệu: Chỉ cho phép cập nhật dữ liệu nếu thỏa mãn điều kiện nhất định.
  • Giữ nguyên cú pháp truy cập như thuộc tính thông thường, nhưng thực tế có thể xử lý logic bên trong thông qua getter và setter.

Getters và Setters trong Python

Trong Python, gettersetter là hai phương thức được sử dụng để truy cập và cập nhật giá trị của các thuộc tính trong một lớp:

  • Getter: Giúp lấy giá trị của một thuộc tính. Thông thường, phương thức getter có tên bắt đầu bằng get_ theo sau là tên thuộc tính.
  • Setter: Giúp gán giá trị cho một thuộc tính. Phương thức setter thường có tên bắt đầu bằng set_ theo sau là tên thuộc tính.

Việc sử dụng getter và setter giúp bảo vệ dữ liệu trong lập trình hướng đối tượng, đảm bảo rằng các thuộc tính chỉ được truy cập hoặc thay đổi theo cách có kiểm soát.

Ví dụ 1: Getters và Setters

Dưới đây là một ví dụ minh họa sử dụng getters và setters trong một lớp HostingPlan, mô phỏng việc quản lý thông tin về gói hosting:

class HostingPlan:
    def __init__(self, plan_name, storage):
        self.__plan_name = plan_name  # Thuộc tính riêng tư
        self.__storage = storage
    # Getter cho tên gói
    def get_plan_name(self):
        return self.__plan_name
    # Setter cho tên gói
    def set_plan_name(self, plan_name):
        self.__plan_name = plan_name
    # Getter cho dung lượng lưu trữ
    def get_storage(self):
        return self.__storage    
    # Setter cho dung lượng lưu trữ
    def set_storage(self, storage):
        self.__storage = storage
# Tạo một đối tượng HostingPlan
plan = HostingPlan("Vietnix NVMe Pro", "100GB")
# Lấy thông tin gói hosting
print("Gói hosting:", plan.get_plan_name(), "- Dung lượng:", plan.get_storage())
# Cập nhật thông tin gói
plan.set_plan_name("Vietnix NVMe Business")
plan.set_storage("200GB")
# Kiểm tra thông tin sau khi cập nhật
print("Gói hosting:", plan.get_plan_name(), "- Dung lượng:", plan.get_storage())
  • Kết quả như sau:

Gói hosting: Vietnix NVMe Pro – Dung lượng: 100GB
Gói hosting: Vietnix NVMe Business – Dung lượng: 200GB

Ví dụ 2: Sử dụng property() để tối ưu getter và setter

Python cung cấp hàm property() để tạo getter và setter dưới dạng thuộc tính, giúp truy cập và cập nhật giá trị một cách trực quan hơn. Ví dụ sau sử dụng property() để tối ưu lớp HostingPlan:

class HostingPlan:
    def __init__(self, plan_name, storage):
        self.__plan_name = plan_name
        self.__storage = storage
    def get_plan_name(self):
        return self.__plan_name
    def set_plan_name(self, plan_name):
        self.__plan_name = plan_name
    def get_storage(self):
        return self.__storage  
    def set_storage(self, storage):
        self.__storage = storage
    # Tạo thuộc tính với property()
    plan_name = property(get_plan_name, set_plan_name, "Tên gói hosting")
    storage = property(get_storage, set_storage, "Dung lượng lưu trữ")
# Tạo đối tượng
plan = HostingPlan("Vietnix NVMe Starter", "50GB")
# Truy cập thông tin gói hosting bằng property
print("Gói hosting:", plan.plan_name, "- Dung lượng:", plan.storage)
# Cập nhật thông tin
plan.plan_name = "Vietnix NVMe Advanced"
plan.storage = "150GB"
# Kiểm tra sau khi cập nhật
print("Gói hosting:", plan.plan_name, "- Dung lượng:", plan.storage)
  • Kết quả như sau:

Gói hosting: Vietnix NVMe Starter – Dung lượng: 50GB
Gói hosting: Vietnix NVMe Advanced – Dung lượng: 150GB

Lợi ích của Getters và Setters:

  • Kiểm soát truy cập: Giúp giới hạn quyền truy cập vào các thuộc tính riêng tư.
  • Bảo vệ dữ liệu: Đảm bảo giá trị hợp lệ trước khi gán cho thuộc tính.
  • Dễ bảo trì: Có thể thay đổi logic xử lý mà không ảnh hưởng đến mã nguồn sử dụng lớp.
  • Cải thiện khả năng đọc code: Dễ hiểu hơn khi sử dụng property() thay vì gọi trực tiếp phương thức getter/setter.

Vietnix – Nhà cung cấp dịch vụ lưu trữ tốc độ cao

Vietnix tự hào là một trong những đơn vị hàng đầu trong lĩnh vực web hosting, mang đến giải pháp lưu trữ mạnh mẽ với hạ tầng máy chủ hiện đại và hệ thống backup tự động, đảm bảo an toàn dữ liệu tuyệt đối. Dịch vụ đa dạng như Hosting Giá RẻBusiness HostingWordPress HostingSEO Hosting và MaxSpeed Hosting giúp đáp ứng nhu cầu của mọi cá nhân và doanh nghiệp. Không chỉ vậy, Vietnix còn cung cấp VPS chất lượng cao, tối ưu hiệu suất và đảm bảo quản lý hệ thống dễ dàng. Liên hệ ngay để được tư vấn dịch vụ phù hợp!

Thông tin liên hệ:

  • Hotline: 18001093
  • Email: sales@vietnix.com.vn 
  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
  • Website: https://vietnix.vn/

Câu hỏi thường gặp

Việc đặt Access Modifiers trong Python có ảnh hưởng đến khả năng mở rộng của class không?

Có ảnh hưởng, nhưng phụ thuộc vào cách sử dụng:
– Nếu sử dụng hợp lý, access modifiers giúp bảo vệ dữ liệu và duy trì API ổn định, giúp việc mở rộng dễ dàng hơn.
– Nếu lạm dụng private, có thể làm giảm khả năng mở rộng và tái sử dụng của class.
– Thay vì cấm truy cập hoàn toàn, Python khuyến khích sử dụng protected (_var) và getter/setter (property) để đạt được sự cân bằng giữa bảo vệ và mở rộng.

Tại sao Python không thực sự cấm truy cập vào biến private và điều này có phải là một nhược điểm không?

Python không có cơ chế ép buộc giới hạn quyền truy cập vào biến private (__private_var) như các ngôn ngữ như Java hay C++. Lý do chính là Python đề cao tính linh hoạt và sự tin tưởng vào lập trình viên, thay vì áp đặt các hạn chế cứng nhắc.

Có cách nào giúp debug hoặc kiểm tra xem một biến private/protected có bị truy cập trái phép không?

Mặc dù Python không thực sự giới hạn việc truy cập biến private (__var) hay protected (_var), nhưng bạn có thể áp dụng một số kỹ thuật để giám sát và phát hiện hành vi truy cập trái phép. Dưới đây là một số cách:
1. Sử dụng Getter và Setter kèm Logging.
2. Dùng property() để bảo vệ biến Private.
3. Sử dụng getattr hoặc setattr để giám sát truy cập.
4. Dùng inspect Module để kiểm tra Stack Trace khi biến truy cập.
5. Dùng metaclass hoặc decorator để kiểm soát truy cập.

Lời kết

Access Modifiers trong Python đóng vai trò quan trọng trong việc kiểm soát quyền truy cập vào các thuộc tính và phương thức của lớp. Hiểu và sử dụng đúng các mức truy cập public, protected, private sẽ giúp bạn xây dựng mã nguồn an toàn, dễ bảo trì và tuân theo nguyên tắc lập trình hướng đối tượng. Việc áp dụng Access Modifiers một cách hợp lý không chỉ giúp bảo vệ dữ liệu mà còn tối ưu hóa khả năng mở rộng của ứng dụng. Cảm ơn bạn đã theo dõi bài viết!

Mọi người cũng xem:

Cao Lê Viết Tiến

PHP Leader
tại
Vietnix

Kết nối với mình qua

Icon Quote
Icon Quote

Học lập trình online cùng vietnix

Học lập trình online cùng Vietnix

PHPXem thêmThu gọn