การห่อหุ้มใน Python

Jan 21 2023
Encapsulation เป็นคำเมื่อได้ยินเป็นครั้งแรกนั้นดูเป็นเรื่องแฟนซี เป็นเรื่องทางเทคนิคและซับซ้อนในโลกของการเขียนโปรแกรม โดยเฉพาะอย่างยิ่งถ้าคุณเป็นมือใหม่ เมื่อฉันพยายามเรียนรู้เกี่ยวกับการห่อหุ้มจากแหล่งต่างๆ ฉันหวังว่าใครสักคนสามารถอธิบายให้เข้าใจง่ายขึ้นด้วยวิธีเล่าเรื่อง

Encapsulation เป็นคำเมื่อได้ยินเป็นครั้งแรกนั้นดูเป็นเรื่องแฟนซี เป็นเรื่องทางเทคนิคและซับซ้อนในโลกของการเขียนโปรแกรม โดยเฉพาะอย่างยิ่งถ้าคุณเป็นมือใหม่ เมื่อฉันพยายามเรียนรู้เกี่ยวกับการห่อหุ้มจากแหล่งต่างๆ ฉันหวังว่าใครสักคนสามารถอธิบายให้เข้าใจง่ายขึ้นด้วยวิธีเล่าเรื่อง ดังนั้นฉันจึงพยายามอธิบายการห่อหุ้มอย่างที่ฉันเข้าใจหลังจากผ่านเนื้อหามากมายทั้งออนไลน์และออฟไลน์

  • ในขณะที่คุณมาที่นี่เพื่อเรียนรู้เกี่ยวกับการห่อหุ้ม ฉันคิดว่าคุณมีความรู้เกี่ยวกับ OOP ( Object Oriented Programming ) มาบ้างแล้ว

“ Encapsulation เป็นกลไกของการห่อข้อมูล (ตัวแปร) และรหัสที่กระทำกับข้อมูล (เมธอด) เข้าด้วยกันเป็นหน่วยเดียว ”

ดูเหมือนจะเป็นคำจำกัดความที่ค่อนข้างอันตรายในตัวมันเอง ให้เข้าใจด้วยวิธีง่ายๆ

สมมติว่าคุณเป็นโปรแกรมเมอร์อาวุโสของสตาร์ทอัพ และคุณมีทีมที่รับผิดชอบในการสร้างกลไกที่อนุญาตให้ผู้ใช้สร้างบัญชีในแอปพลิเคชันของสตาร์ทอัพของคุณ สมมติว่าตอนนี้คุณต้องการให้ตั้งค่าบัญชีโดยใช้ชื่อและรหัสผ่านของผู้ใช้เท่านั้น และรหัสผ่านเดียวที่คุณอนุญาตคือตัวเลข ใช่! ฉันรู้ว่ามันใช้ไม่ได้จริงในโลกแห่งความเป็นจริงที่รหัสผ่านจะเป็นตัวเลขเท่านั้น แต่ให้สันนิษฐานไว้ก่อนเพื่อความเข้าใจในหัวข้อนี้ ในฐานะโปรแกรมเมอร์อาวุโส คุณจะต้องรับผิดชอบในการสร้างคลาสบัญชี และโปรแกรมเมอร์รุ่นเยาว์จะต้องรับผิดชอบในการใช้คลาสนั้น

สมมติว่าคุณสร้างคลาสดังต่อไปนี้:

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"

สมมติว่า ' Rohit ' เป็นผู้ใช้และเขาสร้างบัญชีโดยใช้คำสั่งต่อไปนี้:

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

ตอนนี้เพื่อจัดการกับสถานการณ์ประเภทนี้การห่อหุ้มกลายเป็นซูเปอร์ฮีโร่ของเราเพื่อบันทึกงานและตัวตนของผู้ใช้ของเรา

การห่อหุ้มคืออะไร มันช่วยให้คุณทำให้ตัวแปรของคุณเป็นแบบส่วนตัว นั่นคือความหมายของการห่อตัวแปร (ข้อมูล ) เราจะทำได้อย่างไรใน python . เพียงเพิ่มเครื่องหมายขีดล่างสองครั้งในส่วนนำหน้าของข้อมูลที่คุณต้องการทำให้เป็นส่วนตัว ( __data )

ในกรณีของคลาสบัญชีของเรา เราไม่ต้องการให้คนอื่นรู้รหัสผ่านผู้ใช้ของเรา ดังนั้นเราจะทำการเปลี่ยนแปลงในรหัสของเราดังต่อไปนี้:

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"

ตอนนี้หากมีคนพยายามเข้าถึงตัวแปรรหัสผ่าน เขา/เธอจะได้รับข้อผิดพลาดดังต่อไปนี้:

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

แต่ทำไมถึงมีแนวคิดของการห่อหุ้มถ้าไม่มีอะไรเป็นส่วนตัว? ฉันรู้ว่านั่นคือสิ่งที่เกิดขึ้นในใจของคุณ ใช่ไหม?. สิ่งที่จำเป็นคือการห่อหุ้มเมื่อคุณไม่ต้องการให้ผู้อื่น (โปรแกรมเมอร์รุ่นเยาว์ ผู้ใช้) รู้หรือทำการเปลี่ยนแปลงในตัวแปรที่สำคัญ วิธีการ จนกว่าพวกเขาจะไม่สามารถเข้าถึงซอร์สโค้ดได้ พวกเขาจะไม่สามารถรู้ได้ว่าตัวแปรหรือเมธอดใดเป็นส่วนตัว ดังนั้นจึงไม่สามารถเข้าถึงหรือแก้ไขได้

แต่จะเป็นอย่างไรหาก Rohit ลืมรหัสผ่านและต้องการเรียกคืนหรือเปลี่ยนรหัสผ่าน ข้อตกลงคือเราทำ 2 วิธีในคลาสของเราซึ่งจะอนุญาตให้เข้าถึงและเปลี่ยนแปลงตัวแปรส่วนตัวที่เรียกว่าเมธอดGetterและSetter วิธีการทำเหล่านี้? ใช้รหัสต่อไปนี้:

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

ไม่เพียงแค่ตัวแปรเท่านั้น python ยังอนุญาตให้คุณทำให้วิธีการของคุณเป็นส่วนตัว กระบวนการเหมือนกัน เพียงเปลี่ยนชื่อเมธอดของคุณเป็น “__เมธอด” และวิธีการของคุณจะถูกทำให้เป็นแบบส่วนตัว

แนวคิดทั้งหมดของการสร้างตัวแปรส่วนตัว การเข้าถึงตัวแปร ส่วนตัวผ่านเมธอด getterและการเปลี่ยนค่าตัวแปรไพรเวตโดยใช้เมธอด setterเรียกว่าEncapsulation

หวังว่าบล็อกนี้จะช่วยคุณได้บ้าง ออกจากระบบ ! บาย