Đóng gói trong Python

Jan 21 2023
Đóng gói như một từ khi nghe lần đầu tiên có vẻ rất lạ mắt, kỹ thuật và phức tạp để làm trong thế giới lập trình, đặc biệt nếu bạn là người mới bắt đầu. Khi tôi cố gắng tìm hiểu về tính đóng gói từ nhiều nguồn khác nhau, tôi ước ai đó có thể làm cho nó dễ hiểu hơn theo cách tường thuật.

Đóng gói như một từ khi nghe lần đầu tiên có vẻ rất lạ mắt, kỹ thuật và phức tạp để làm trong thế giới lập trình, đặc biệt nếu bạn là người mới bắt đầu. Khi tôi cố gắng tìm hiểu về tính đóng gói từ nhiều nguồn khác nhau, tôi ước ai đó có thể làm cho nó dễ hiểu hơn theo cách tường thuật. Vì vậy, ở đây tôi đang cố gắng giải thích sự đóng gói theo cách mà tôi đã hiểu sau khi xem qua hàng tấn tài liệu cả trực tuyến và ngoại tuyến.

  • Khi bạn ở đây để tìm hiểu về đóng gói, tôi cho rằng bạn đã có một số kiến ​​thức về OOP (Lập trình hướng đối tượng).

“ Đóng gói là một cơ chế gói dữ liệu (biến) và mã hoạt động trên dữ liệu (phương thức) lại với nhau thành một đơn vị ”

Bản thân nó có vẻ như là một định nghĩa khá nguy hiểm. hãy hiểu nó một cách đơn giản.

Giả sử bạn là lập trình viên cấp cao của một công ty khởi nghiệp và bạn có một nhóm chịu trách nhiệm xây dựng cơ chế cho phép người dùng tạo tài khoản trên ứng dụng của công ty khởi nghiệp của bạn. Giả sử bây giờ bạn chỉ muốn tài khoản được thiết lập bằng tên và mật khẩu của người dùng và mật khẩu duy nhất bạn cho phép là số. Đúng! Tôi biết nó không thực tế trong thế giới thực đối với mật khẩu chỉ là số nhưng hãy giả sử nó để hiểu chủ đề. Là một lập trình viên cấp cao, bạn sẽ chịu trách nhiệm tạo lớp tài khoản và các lập trình viên cấp dưới sẽ chịu trách nhiệm sử dụng lớp đó.

giả sử bạn đã tạo lớp như sau:

class Account:
    # constructor
    def __init__(self):
        self.user = ''
        self.password = 0
        self.menu()
    
    # display option
    def menu(self):
        user_input = input("""
        Select to Enter the following details:
        1. set account
        2. login
        5. Exit
        """)
        if user_input == '1':
            self.set_account()
        elif user_input == '2':
            self.login()
        else:
            exit()
    # To set account
    def set_account(self):
        user_name = input("set user id: ")
        self.user = user_name
        user_password = int(input("Set Password: "))
        self.password = user_password
    # To login
    def login(self):
        user_input = input("enter User id: ")
        if user_input == self.user:
            user_pass = int(input("enter password: "))
            if user_pass == self.password:
                return "Welcome {}".format(self.user)
            else:
                return "wrong password"
        else:
            return "user not found"

giả sử ' Rohit ' là người dùng và anh ấy đã tạo tài khoản bằng lệnh sau:

rohit = Account()

# after running the above code we get the prompt and add the following detail
"""
Select to Enter the following details:
        1. set account
        2. login
        5. Exit
        1
set user id: rohit
Set Password: 123
"""

rohit.password

Giờ đây, để giải quyết các loại tình huống này , tính năng đóng gói xuất hiện với tư cách là siêu anh hùng của chúng tôi để cứu công việc và danh tính người dùng của chúng tôi.

Đóng gói làm gì, nó cho phép bạn đặt các biến của mình ở chế độ riêng tư. Đó là ý nghĩa của việc gói các biến(dữ liệu) . Làm thế nào chúng ta có thể làm điều đó trong python . Chỉ cần thêm hai dấu gạch dưới vào tiền tố của dữ liệu bạn muốn đặt ở chế độ riêng tư ( __data ).

Bây giờ trong trường hợp lớp Tài khoản của chúng tôi, chúng tôi không muốn người khác biết mật khẩu người dùng của mình. vì vậy chúng tôi sẽ thực hiện một thay đổi trong mã của chúng tôi như sau:

class Account:

    def __init__(self):
        self.user = ''
        self.__password = 0
        self.menu()
            
    def menu(self):
        user_input = input("""
        Select to Enter the following details:
        1. set account
        2. login
        5. Exit
        """)
        if user_input == '1':
            self.set_account()
        elif user_input == '2':
            self.login()
        else:
            exit()
    
    def set_account(self):
        user_name = input("set user id: ")
        self.user = user_name
        user_password = int(input("Set Password: "))
        self.__password = user_password
    
    def login(self):
        user_input = input("enter User id: ")
        if user_input == self.user:
            user_pass = int(input("enter password: "))
            if user_pass == self.__password:
                return "Welcome {}".format(self.user)
            else:
                return "wrong password"
        else:
            return "user not found"

Bây giờ nếu ai đó cố truy cập vào biến mật khẩu, người đó sẽ gặp lỗi như sau:

rohit.password

# running the above piece of code will output the following error
"""
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-7ddf6c297392> in <module>
----> 1 rohit.password

AttributeError: 'Account' object has no attribute 'password'
"""

rohit._Account__password

# Output 
# 1234

Nhưng tại sao thậm chí còn có khái niệm đóng gói nếu không có gì là riêng tư? Tôi biết đó là những gì đang diễn ra trong tâm trí của bạn, phải không?. Vì vậy, vấn đề là, tính đóng gói là cần thiết khi bạn không muốn người khác (lập trình viên mới vào nghề, người dùng) biết hoặc thực hiện các thay đổi đối với các biến, phương thức quan trọng. Cho đến khi và trừ khi họ có thể truy cập mã nguồn, họ sẽ không thể biết biến hoặc phương thức nào là riêng tư và do đó, sẽ không thể truy cập hoặc thay đổi chúng.

Nhưng nếu Rohit quên mật khẩu của mình và muốn lấy lại hoặc thay đổi nó thì sao. Quy ước là chúng ta tạo 2 phương thức trong lớp cho phép truy cập và thay đổi biến riêng được gọi là phương thức Getter và Setter . làm thế nào để làm cho những điều này? sử dụng đoạn mã sau:

class Account:

    def __init__(self):
        self.user = ''
        self.__password = 0
        self.menu()
    
    # GETTER
    def get_pass(self):
        return self._Account__password
    # SETTER
    def set_pass(self,newpass):
        if type(newpass) == int:
            self.__password = newpass
        else: return "Password should only be numeric"
            
    def menu(self):
        user_input = input("""
        Select to Enter the following details:
        1. set account
        2. login
        5. Exit
        """)
        if user_input == '1':
            self.set_account()
        elif user_input == '2':
            self.login()
        else:
            exit()
    
    def set_account(self):
        user_name = input("set user id: ")
        self.user = user_name
        user_password = int(input("Set Password: "))
        self.__password = user_password
    
    def login(self):
        user_input = input("enter User id: ")
        if user_input == self.user:
            user_pass = int(input("enter password: "))
            if user_pass == self.__password:
                return "Welcome {}".format(self.user)
            else:
                return "wrong password"
        else:
            return "user not found

Không chỉ các biến, python thậm chí còn cho phép bạn đặt các phương thức của mình ở chế độ riêng tư. Quy trình cũng giống như vậy, chỉ cần thay đổi tên phương thức của bạn thành “ __method ” và phương thức của bạn sẽ được đặt ở chế độ riêng tư.

Toàn bộ khái niệm tạo biến riêng, truy cập biến riêng thông qua phương thức getter và thay đổi giá trị biến riêng bằng cách sử dụng phương thức setter được gọi là Đóng gói .

Hy vọng blog này có thể giúp bạn một cách nào đó. ký tắt! tạm biệt