เพื่อวัตถุประสงค์ของการห่อหุ้มข้อมูล (data encapsulation) ภาษาเชิงวัตถุส่วนใหญ่ใช้เมธอด getter และ setter เนื่องจากเราต้องการซ่อนแอตทริบิวต์ของคลาสออบเจ็กต์จากคลาสอื่นๆ เพื่อไม่ให้เกิดการแก้ไขข้อมูลโดยบังเอิญโดยเมธอดในคลาสอื่น
ตามที่ชื่อบ่งชี้ getter คือเมธอดที่ช่วยเข้าถึงแอตทริบิวต์ส่วนตัว (private attributes) หรือรับค่าของแอตทริบิวต์ส่วนตัว และ setter คือเมธอดที่ช่วยเปลี่ยนหรือตั้งค่าของแอตทริบิวต์ส่วนตัว
การเข้าถึงแอตทริบิวต์ส่วนตัว
ด้านล่างเราเขียนโค้ดสร้างคลาส เริ่มต้นและเข้าถึงตัวแปรของมันโดยไม่สร้างเมธอดเพิ่มเติม
ตัวอย่าง
class year_graduated:
def __init__(self, year=0):
self._year = year # Instantiating the class
grad_obj = year_graduated()
# Printing the object
print(grad_obj)
# Printing the object attribute
print(grad_obj.year)
เอาต์พุต
การรันโค้ดข้างต้นให้ผลลัพธ์ดังนี้ -
<__main__.year_graduated object at 0x00F2DD50> 0
คำสั่ง print แรกให้รายละเอียดของออบเจ็กต์ที่สร้างขึ้น คำสั่ง print ที่สองให้ค่าเริ่มต้นของแอตทริบิวต์ส่วนตัว
ใช้ Getters และ Setters
ในตัวอย่างด้านล่าง เราจะสร้างคลาส เริ่มต้น และเพิ่มเมธอด getter และ setter ให้แต่ละตัว แล้วเข้าถึงตัวแปรในเมธอดเหล่านี้โดยสร้างอินสแตนซ์ของคลาสและใช้เมธอด getter และ setter เหล่านี้ ดังนั้นคุณสามารถซ่อนตรรกะของคุณไว้ภายในเมธอด setter
ตัวอย่าง
class year_graduated:
def __init__(self, year=0):
self._year = year
# getter method
def get_year(self):
return self._year
# setter method
def set_year(self, a):
self._year = a
grad_obj = year_graduated()
# ก่อนใช้ setter
print(grad_obj.get_year())
# หลังใช้ setter
grad_obj.set_year(2019)
print(grad_obj._year)
เอาต์พุต
การรันโค้ดข้างต้นให้ผลลัพธ์ดังนี้:
0 2019
ทำให้แอตทริบิวต์เป็น Private
ในตัวอย่างต่อไป เราจะเห็นวิธีทำให้เมธอดเป็นส่วนตัว (private) เพื่อให้ตัวแปรในมันไม่สามารถจัดการโดยฟังก์ชันเรียกภายนอกได้ พวกมันสามารถจัดการได้เฉพาะโดยฟังก์ชันภายในคลาส พวกมันจะกลายเป็น private โดยการเติม underscore สองตัวข้างหน้า
ตัวอย่าง
class year_graduated:
def __init__(self, year=32):
self._year = year
# ทำให้ getter method เป็น private
def get_year(self):
return self.__year
# ทำให้ setter method เป็น private
def set_year(self, a):
self.__year = a
grad_obj = year_graduated()
print(grad_obj._year)
# ก่อนใช้ setter
print(grad_obj.get_year())
# หลังใช้ setter
grad_obj.set_year(2019)
print(grad_obj._year)
เอาต์พุต
การรันโค้ดข้างต้นให้ผลลัพธ์ดังนี้:
32 AttributeError: 'year_graduated' object has no attribute '_year_graduated__year'
อ่านค่าจากเมธอด Private
ตอนนี้เราสามารถเข้าถึงค่าแอตทริบิวต์ส่วนตัวได้โดยใช้ property method และไม่ต้องใช้ getter method
ตัวอย่าง
class year_graduated:
def __init__(self, year=32):
self._year = year
@property
def Aboutyear(self):
return self.__year
@Aboutyear.setter
def Aboutyear(self, a):
self.__year = a
grad_obj = year_graduated()
print(grad_obj._year)
grad_obj.year = 2018
print(grad_obj.year)
เอาต์พุต
การรันโค้ดข้างต้นให้ผลลัพธ์ดังนี้:
32 2018