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

Getter และ Setter ใน Python


สำหรับวัตถุประสงค์ของการห่อหุ้มข้อมูล ภาษาเชิงวัตถุส่วนใหญ่ใช้เมธอด getters และ setters เนื่องจากเราต้องการซ่อนแอตทริบิวต์ของคลาสอ็อบเจ็กต์จากคลาสอื่น เพื่อไม่ให้มีการแก้ไขข้อมูลโดยไม่ได้ตั้งใจโดยวิธีการในคลาสอื่น

ตามชื่อที่แนะนำ getters คือวิธีที่ช่วยเข้าถึงแอตทริบิวต์ส่วนตัวหรือรับค่าของแอตทริบิวต์ส่วนตัวและ setters คือวิธีการที่ช่วยเปลี่ยนหรือตั้งค่าของแอตทริบิวต์ส่วนตัว

การเข้าถึงแอตทริบิวต์ส่วนตัว

ด้านล่างเราเขียนโค้ดเพื่อสร้างคลาส เริ่มต้น และเข้าถึงตัวแปรโดยไม่ต้องสร้างเมธอดเพิ่มเติม

ตัวอย่าง

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

แม้ว่าคำสั่งการพิมพ์ครั้งแรกจะให้รายละเอียดของวัตถุที่สร้างขึ้น แต่วัตถุการพิมพ์ที่สองจะให้ค่าเริ่มต้นของแอตทริบิวต์ส่วนตัว

การใช้ 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()
# Before using setter
print(grad_obj.get_year())

# After using setter
grad_obj.set_year(2019)
print(grad_obj._year)

ผลลัพธ์

การเรียกใช้โค้ดด้านบนทำให้เราได้ผลลัพธ์ดังต่อไปนี้:

0
2019

ทำให้แอตทริบิวต์เป็นส่วนตัว

ในตัวอย่างต่อไป เราจะเห็นวิธีการทำให้เมธอดเป็นส่วนตัวเพื่อไม่ให้ตัวแปรที่อยู่ในนั้นถูกจัดการโดยฟังก์ชันการเรียกภายนอก สามารถจัดการได้โดยฟังก์ชันภายในคลาสเท่านั้น พวกเขากลายเป็นส่วนตัวโดยนำหน้าด้วยขีดล่าง 2 อัน

ตัวอย่าง

class year_graduated:
   def __init__(self, year=32):
      self._year = year

   # make the getter method
   def get_year(self):
      return self.__year

   # make the setter method
   def set_year(self, a):
      self.__year = a

grad_obj = year_graduated()
print(grad_obj._year)

# Before using setter
print(grad_obj.get_year())
#
# # After using setter
grad_obj.set_year(2019)
print(grad_obj._year)

ผลลัพธ์

การเรียกใช้โค้ดด้านบนทำให้เราได้ผลลัพธ์ดังต่อไปนี้:

32
AttributeError: 'year_graduated' object has no attribute '_year_graduated__year'

การอ่านค่าจากเมธอดส่วนตัว

ไม่ เราสามารถเข้าถึงค่าแอตทริบิวต์ส่วนตัวได้โดยใช้วิธีคุณสมบัติและไม่ใช้วิธีรับ

ตัวอย่าง

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