Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Getter และ Setter ใน Python

เพื่อวัตถุประสงค์ของการห่อหุ้มข้อมูล (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