Tại sao python không hỗ trợ đóng gói?

Đóng gói là một trong những tính năng quan trọng của lập trình hướng đối tượng, bao gồm việc gói các thành viên dữ liệu và chức năng bên trong một lớp duy nhất. Kết hợp các thành viên dữ liệu và chức năng tương tự bên trong một lớp cũng giúp ẩn dữ liệu. Đóng gói cũng đảm bảo rằng các đối tượng là các phần chức năng tự túc và có thể hoạt động độc lập

Để hiểu chủ đề này, bạn nên có một số kiến ​​thức về các chủ đề Lập trình Python sau

Phạm vi

  • Trong chủ đề này, chúng tôi sẽ giới thiệu bản thân về khái niệm đóng gói
  • Sau đó, chúng ta sẽ thảo luận về nhu cầu đóng gói trong Python
  • Chúng ta cũng sẽ thảo luận về các loại Công cụ sửa đổi truy cập khác nhau trong Python

Đóng gói trong Python là gì?

Đóng gói là một trong những khái niệm nền tảng của OOP. Ý tưởng cơ bản của Đóng gói là gói cả dữ liệu và phương thức vào một đơn vị duy nhất. Cách tổ chức dữ liệu và phương pháp không quan trọng đối với người dùng cuối. Người dùng chỉ quan tâm đến cách cung cấp đầu vào phù hợp và mong đợi một đầu ra chính xác trên cơ sở các đầu vào được cung cấp

Tại sao python không hỗ trợ đóng gói?
Đóng gói trong Python cũng đảm bảo rằng các đối tượng là các phần chức năng tự túc và có thể hoạt động độc lập

Tại sao chúng ta cần Đóng gói trong Python?

Những ưu điểm của Encapsulation trong Python có thể được tóm tắt như sau –

1. Đóng gói cung cấp mã được xác định rõ, có thể đọc được

Ưu điểm chính của việc sử dụng Đóng gói trong Python là với tư cách là người dùng, chúng ta không cần biết kiến ​​trúc của các phương thức và dữ liệu và chỉ có thể tập trung vào việc sử dụng các đơn vị được đóng gói, chức năng này cho các ứng dụng của mình. Điều này dẫn đến một mã có tổ chức và sạch sẽ hơn. Trải nghiệm người dùng cũng được cải thiện đáng kể và giúp hiểu toàn bộ ứng dụng dễ dàng hơn

Một ưu điểm khác của đóng gói là nó ngăn chặn việc sửa đổi ngẫu nhiên dữ liệu và phương thức. Hãy xem xét lại ví dụ về NumPy, nếu tôi có quyền truy cập để chỉnh sửa thư viện, thì tôi có thể mắc lỗi khi triển khai hàm trung bình và sau đó vì lỗi đó mà hàng ngàn dự án sử dụng NumPy sẽ trở nên không chính xác.

3. Đóng gói cung cấp bảo mật

Đóng gói trong Python đạt được thông qua các công cụ sửa đổi truy cập. Các công cụ sửa đổi quyền truy cập này đảm bảo rằng các điều kiện truy cập không bị vi phạm và do đó mang lại trải nghiệm tuyệt vời cho người dùng về mặt bảo mật

Công cụ sửa đổi truy cập trong đóng gói Python

Đôi khi có thể cần hạn chế hoặc giới hạn quyền truy cập vào một số biến hoặc chức năng nhất định trong khi lập trình. Đó là nơi các công cụ sửa đổi truy cập xuất hiện

Bây giờ khi chúng ta đang nói về quyền truy cập, có thể sử dụng 3 loại chỉ định quyền truy cập khi thực hiện Đóng gói trong Python. Chúng như sau

  1. Thành viên công cộng
  2. Thành viên riêng tư
  3. Thành viên được bảo vệ
Tại sao python không hỗ trợ đóng gói?

Đóng gói trong Python bằng cách sử dụng các thành viên công cộng

Như tên cho thấy, công cụ sửa đổi công khai cho phép các biến và hàm có thể truy cập được từ bất kỳ đâu trong lớp và từ bất kỳ phần nào của chương trình. Theo mặc định, tất cả các biến thành viên đều có công cụ sửa đổi truy cập là công khai

Bây giờ, hãy xem cách chúng ta có thể triển khai Đóng gói trong Python bằng các phương thức công khai –

# illustrating public members & public access modifier 
class pub_mod:
    # constructor
    def __init__(self, name, age):
        self.name = name;
        self.age = age;
 
    def Age(self): 
        # accessing public data member 
        print("Age: ", self.age)
# creating object 
obj = pub_mod("Jason", 35);
# accessing public data member 
print("Name: ", obj.name)  
# calling public member function of the class 
obj.Age()

Rõ ràng, từ đoạn mã trên, bạn có thể nhận ra rằng chúng ta đã khai báo hai biến và hai phương thức của lớp pub_mod. Chúng tôi có thể truy cập các biến và phương thức bất cứ nơi nào chúng tôi muốn một cách dễ dàng vì công cụ sửa đổi quyền truy cập cho chúng là công khai, điều đó có nghĩa là chúng có thể truy cập được ở mọi nơi

Yêu cầu này được thỏa mãn như chúng ta có thể thấy trong đầu ra –

Đóng gói trong Python bằng các thành viên riêng

Công cụ sửa đổi truy cập riêng cho phép các phương thức và biến thành viên chỉ được truy cập trong lớp. Để chỉ định một công cụ sửa đổi quyền truy cập riêng tư cho một thành viên, chúng tôi sử dụng dấu gạch dưới kép __

Hãy xem ví dụ này để hiểu cách chúng ta có thể triển khai Đóng gói bằng các thành viên riêng tư –

# illustrating private members & private access modifier 
class Rectangle:
  __length = 0 #private variable
  __breadth = 0#private variable
  def __init__(self): 
    #constructor
    self.__length = 5
    self.__breadth = 3
    #printing values of the private variable within the class
    print(self.__length)
    print(self.__breadth)
 
rect = Rectangle() #object created 
#printing values of the private variable outside the class 
print(rect.length)
print(rect.breadth)

Chúng tôi đã truy cập len cả bên trong và bên ngoài lớp trong đoạn mã trên. Hãy xem loại đầu ra nào mang lại cho chúng ta

Đầu ra –

5
3
Traceback (most recent call last) :
  File "main.py", line 14, in 
     print(rect.length)
AttributeError: 'Rectangle' object has no attribute 'length'

Chúng tôi có thể thấy rằng chúng tôi đã nhận được AttributeError ở đầu ra. Bạn có đoán được tại sao không?

Chà, suy nghĩ của bạn nên hướng tới công cụ sửa đổi quyền truy cập riêng tư

Vì len là một thành viên riêng tư và chúng tôi đã cố gắng truy cập nó bên ngoài lớp, đó là lý do tại sao chúng tôi nhận được lỗi trên. Chúng ta có thể truy cập các thành viên private từ bên ngoài một lớp bằng hai cách tiếp cận sau

  • Phương thức công khai để truy cập các thành viên riêng tư
  • Đặt tên Mangling để truy cập các thành viên riêng tư

Phương thức công khai để truy cập các thành viên riêng tư

# illustrating protected members & protected access modifier 
class details:
    _name="Jason"
    _age=35
    _job="Developer"
class pro_mod(details):
    def __init__(self):
        print(self._name)
        print(self._age)
        print(self._job)
 
# creating object of the class 
obj = pro_mod()

Đặt tên Mangling để truy cập các thành viên riêng tư

Chúng ta có thể truy cập trực tiếp các biến riêng tư và được bảo vệ từ bên ngoài một lớp thông qua xáo trộn tên. Xáo trộn tên được tạo trên một mã định danh bằng cách thêm hai dấu gạch dưới ở đầu và một dấu gạch dưới ở cuối, như thế này _classname__dataMember, trong đó tên lớp là lớp hiện tại và thành viên dữ liệu là tên biến riêng

class details:
    _name="Jason"
    _age=35
    _job="Developer"
class pro_mod(details):
    def __init__(self):
        print(self._name)
        print(self._age)
        print(self._job)
 
# creating object of the class 
obj = pro_mod()
# direct access of protected member
print("Name:",obj._name)
print("Age:",obj._age)

Đóng gói trong Python bằng cách sử dụng các thành viên được bảo vệ

Điều khiến các thành viên protected khác với các thành viên private là chúng cho phép các thành viên được truy cập trong lớp và cho phép chúng được truy cập bởi các lớp con có liên quan. Trong Python, chúng tôi chứng minh một thành viên được bảo vệ bằng tiền tố có dấu gạch dưới _ trước tên của nó

Như chúng ta biết, nếu các thành viên có một công cụ xác định quyền truy cập được bảo vệ, thì nó cũng có thể được tham chiếu trong lớp và các lớp con tiếp theo

Vì vậy, bây giờ chúng ta hãy xem khái niệm này đang hoạt động –

# illustrating protected members & protected access modifier 
class details:
    _name="Jason"
    _age=35
    _job="Developer"
class pro_mod(details):
    def __init__(self):
        print(self._name)
        print(self._age)
        print(self._job)
 
# creating object of the class 
obj = pro_mod()
# direct access of protected member
print("Name:",obj.name)
print("Age:",obj.age)

Đầu ra –

Jason
35 
Developer
Traceback (most recent call last): 
  File "main.py", line 15, in  
    print("Name:",obj.name) 
AttributeError: 'pro_mod' object has no attribute 'name'

Kết quả khá rõ ràng rằng lớp pro_mod đã có thể kế thừa thành công các biến từ các chi tiết của lớp và in chúng ra bàn điều khiển, mặc dù chúng là các biến được bảo vệ. Và khi chúng tôi cố gắng đề cập đến chúng bên ngoài lớp cha và lớp con của chúng, chúng tôi đã nhận được AttributeError cho cùng

Ưu điểm của đóng gói

  • khả năng tái sử dụng mã. Đóng gói trong Python cho phép các nhà phát triển tạo mã có thể tái sử dụng bằng cách ẩn các chi tiết triển khai của một đối tượng hoặc lớp và chỉ hiển thị giao diện chung để tương tác với nó

  • Ẩn dữ liệu. Đóng gói giúp bảo vệ trạng thái bên trong của một đối tượng hoặc lớp khỏi bị mã bên ngoài truy cập hoặc sửa đổi, giúp cải thiện tính bảo mật của ứng dụng

  • Cải thiện khả năng bảo trì. Bằng cách đóng gói các chi tiết triển khai của một đối tượng hoặc lớp, các nhà phát triển có thể thay đổi trạng thái bên trong hoặc hành vi của đối tượng mà không ảnh hưởng đến mã bên ngoài sử dụng nó

  • Dễ hiểu. Đóng gói làm cho mã có tổ chức hơn và dễ hiểu hơn bằng cách tách biệt rõ ràng giao diện công khai khỏi các chi tiết triển khai

  • Kiểm soát tốt hơn các thuộc tính của lớp. Đóng gói cho phép các nhà phát triển kiểm soát tốt hơn các thuộc tính và phương thức của một lớp, bằng cách đặt một số thuộc tính ở chế độ riêng tư hoặc được bảo vệ và chỉ cho phép chúng được truy cập bằng các phương thức cụ thể

  • Thiết kế lớp tốt hơn. Đóng gói khuyến khích các nhà phát triển thiết kế các lớp gắn kết và có một trách nhiệm duy nhất, điều này làm cho mã trở nên mô đun hơn và dễ bảo trì hơn

Phần kết luận

Cuối cùng bạn đã đọc đến cuối bài viết này và học thành công mọi thứ về một trong những khái niệm cơ bản quan trọng nhất của Lập trình hướng đối tượng

Tại sao Python không có đóng gói?

Việc đóng gói đạt được bằng cách khai báo các thành viên dữ liệu và phương thức của một lớp là riêng tư hoặc được bảo vệ. Nhưng trong Python, chúng tôi không có các từ khóa như công khai, riêng tư và được bảo vệ , như trong trường hợp của Java. Thay vào đó, chúng tôi đạt được điều này bằng cách sử dụng dấu gạch dưới đơn và kép.

Tại sao Python không hỗ trợ đóng gói mạnh?

Tuy nhiên, Python không phải là ngôn ngữ OOP xuyên suốt vì nó không cho phép đóng gói mạnh. Điều này là do người tạo ra nó, Guido van Rossum, muốn giữ mọi thứ đơn giản và điều đó có nghĩa là không ẩn dữ liệu theo nghĩa chặt chẽ nhất của thuật ngữ .

Python có hỗ trợ đóng gói không?

Trong Python, Có thể đóng gói bằng cách khai báo các thành viên dữ liệu của một lớp là riêng tư hoặc được bảo vệ . Trong Python, 'Riêng tư' và 'Được bảo vệ' được gọi là Công cụ sửa đổi truy cập, vì chúng sửa đổi quyền truy cập của các biến hoặc phương thức được xác định trong một lớp. Hãy cho chúng tôi xem các công cụ sửa đổi quyền truy cập giúp đạt được Đóng gói như thế nào.

Nhược điểm của việc đóng gói trong Python là gì?

Nhược điểm của Đóng gói . Đóng gói dẫn đến tăng thời lượng thực hiện chương trình. Đó là bởi vì nhiều hướng dẫn được thêm vào mã do đó chúng cần nhiều thời gian hơn để thực thi. Increased code execution: Encapsulation results in an increase in the duration of the program execution. It is because more instructions are added to the code therefore they require more time to execute.