การห่อหุ้มใน Python
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
หวังว่าบล็อกนี้จะช่วยคุณได้บ้าง ออกจากระบบ ! บาย





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)