Khi làm việc với một ngôn ngữ lập trình hướng đối tượng như Python, encapsulation trong Python là một trong 4 khái niệm quan trọng cần hiểu. Ba cái còn lại là kế thừa, đa hình và trừu tượng
Đóng gói là gì?
Khi làm việc với các lớp và xử lý dữ liệu nhạy cảm, việc cung cấp quyền truy cập toàn cục cho tất cả các biến được sử dụng trong chương trình không phải là một lựa chọn tốt. Đóng gói cung cấp một cách để chúng tôi truy cập các biến cần thiết mà không cung cấp cho chương trình quyền truy cập chính thức vào bất kỳ biến nào trong số đó
Việc cập nhật, sửa đổi hoặc xóa dữ liệu khỏi các biến có thể được thực hiện thông qua việc sử dụng các phương pháp được xác định cụ thể cho mục đích. Lợi ích của việc sử dụng phương pháp lập trình này là cải thiện khả năng kiểm soát dữ liệu đầu vào và bảo mật tốt hơn
Đóng gói trong Python là gì?
Khái niệm đóng gói giống nhau trong tất cả các ngôn ngữ lập trình hướng đối tượng. Sự khác biệt được nhìn thấy khi các khái niệm được áp dụng cho các ngôn ngữ cụ thể
So với các ngôn ngữ như Java cung cấp công cụ sửa đổi quyền truy cập [công khai hoặc riêng tư] cho các biến và phương thức, Python cung cấp quyền truy cập vào tất cả các biến và phương thức trên toàn cầu
Kiểm tra phần trình diễn dưới đây về cách các biến có thể dễ dàng được truy cập
class Person: def __init__[self, name, age=0]: self.name = name self.age = age def display[self]: print[self.name] print[self.age] person = Person['Dev', 30] #accessing using class method person.display[] #accessing directly from outside print[person.name] print[person.age]
đầu ra
Dev 30 Dev 30
Vì chúng tôi không có công cụ sửa đổi quyền truy cập trong Python, nên chúng tôi sẽ sử dụng một số phương pháp khác nhau để kiểm soát quyền truy cập của các biến trong chương trình Python
Phương pháp kiểm soát quyền truy cập
Có nhiều phương thức được Python cung cấp để giới hạn quyền truy cập biến và phương thức trong chương trình. Hãy đi qua các phương pháp chi tiết
Sử dụng dấu gạch dưới đơn
Một quy ước lập trình Python phổ biến để xác định một biến riêng tư là đặt trước nó một dấu gạch dưới. Bây giờ, điều này không thực sự tạo ra bất kỳ sự khác biệt nào về phía trình biên dịch của mọi thứ. Biến vẫn có thể truy cập như bình thường. Nhưng là một quy ước mà các lập trình viên đã chọn, nó nói với các lập trình viên khác rằng các biến hoặc phương thức chỉ được sử dụng trong phạm vi của lớp
Xem ví dụ bên dưới
class Person: def __init__[self, name, age=0]: self.name = name self._age = age def display[self]: print[self.name] print[self._age] person = Person['Dev', 30] #accessing using class method person.display[] #accessing directly from outside print[person.name] print[person._age]
đầu ra
Dev 30 Dev 30
Rõ ràng là truy cập biến không thay đổi. Nhưng chúng ta có thể làm bất cứ điều gì để thực sự làm cho nó riêng tư?
Sử dụng dấu gạch dưới kép
Nếu bạn muốn làm cho các thành viên trong lớp tôi. e. các phương thức và biến riêng tư, thì bạn nên đặt trước chúng hai dấu gạch dưới. Nhưng Python cung cấp một số loại hỗ trợ cho công cụ sửa đổi riêng tư. Cơ chế này được gọi là xáo trộn tên. Với điều này, vẫn có thể truy cập các thành viên lớp từ bên ngoài nó
Tên Mangling
Trong Python, bất kỳ mã định danh nào có __Var đều được trình thông dịch python viết lại thành _Classname__Var và tên lớp vẫn là tên lớp hiện tại. Cơ chế đổi tên này được gọi là Name Mangling trong Python
Trong ví dụ dưới đây, trong Lớp người, biến tuổi đã được thay đổi và nó có tiền tố là dấu gạch dưới kép ở đầu
class Person: def __init__[self, name, age=0]: self.name = name self.__age = age def display[self]: print[self.name] print[self.__age] person = Person['Dev', 30] #accessing using class method person.display[] #accessing directly from outside print['Trying to access variables from outside the class '] print[person.name] print[person.__age]
đầu ra
Dev 30 Trying to access variables from outside the class Dev Traceback [most recent call last]: File "Person.py", line 16, in print[person.__age] AttributeError: 'Person' object has no attribute '__age'
Bạn có thể quan sát rằng các biến vẫn được truy cập bằng các phương thức, đây là một phần của lớp. Nhưng bạn không thể truy cập tuổi trực tiếp từ bên ngoài vì đây là biến riêng tư
Sử dụng các phương thức Getter và Setter để truy cập các biến riêng tư
Nếu bạn muốn truy cập và thay đổi các biến riêng tư, nên sử dụng các phương thức truy cập [getter] và bộ biến đổi [phương thức setter], vì chúng là một phần của Class
class Person: def __init__[self, name, age=0]: self.name = name self.__age = age def display[self]: print[self.name] print[self.__age] def getAge[self]: print[self.__age] def setAge[self, age]: self.__age = age person = Person['Dev', 30] #accessing using class method person.display[] #changing age using setter person.setAge[35] person.getAge[]
đầu ra
Dev 30 35
Lợi ích của việc đóng gói trong Python
Đóng gói không chỉ đảm bảo luồng dữ liệu tốt hơn mà còn bảo vệ dữ liệu khỏi các nguồn bên ngoài. Khái niệm đóng gói làm cho mã tự cung cấp. Nó rất hữu ích ở cấp độ triển khai, vì nó ưu tiên các câu hỏi loại 'làm thế nào', để lại những câu hỏi phức tạp. Bạn nên ẩn dữ liệu trong đơn vị để dễ dàng đóng gói và cũng để bảo mật dữ liệu
Nhu cầu đóng gói trong Python là gì
Những lý do sau đây cho thấy tại sao các nhà phát triển thấy Encapsulation tiện dụng và tại sao khái niệm Hướng đối tượng vượt xa nhiều ngôn ngữ lập trình
- Đóng gói giúp đạt được sự tương tác được xác định rõ trong mọi ứng dụng
- Khái niệm Hướng đối tượng tập trung vào khả năng sử dụng lại mã trong Python. [KHÔ - Đừng lặp lại chính mình]
- Các ứng dụng có thể được duy trì an toàn
- Nó đảm bảo tính linh hoạt của mã thông qua một tổ chức mã thích hợp
- Nó thúc đẩy trải nghiệm mượt mà cho người dùng mà không để lộ bất kỳ sự phức tạp nào của back-end
- Nó cải thiện khả năng đọc mã. Bất kỳ thay đổi nào trong một phần của mã sẽ không ảnh hưởng đến phần khác
- Đóng gói đảm bảo bảo vệ dữ liệu và tránh vô tình truy cập dữ liệu. Dữ liệu được bảo vệ có thể được truy cập bằng các phương pháp được thảo luận ở trên
Đóng gói trong Python là, dữ liệu được ẩn bên ngoài định nghĩa đối tượng. Nó cho phép các nhà phát triển phát triển trải nghiệm thân thiện với người dùng. Điều này cũng hữu ích trong việc bảo mật dữ liệu khỏi các vi phạm, vì mã được bảo mật cao và không thể truy cập bởi các nguồn bên ngoài