Getter và Setter trong lập trình OOP Python

22/02/2023 - lượt xem
Chia sẻ
 
Rate this post

Trong Python, getter và setter không giống như các ngôn ngữ lập trình khác. Về cơ bản, mục đích chính khi  sử dụng getter và setter trong lập trình hướng đối tượng là để đóng gói dữ liệu.

Tham khảo bài viết lập trình hướng đối tượng trong Python.

Bài viết này CodeTuTam cùng các bạn đi tìm hiểu về Getter và Setter trong Python. Đồng thời tìm hiểu cách sử dụng chúng linh hoạt trong từng trường hợp.

Tổng quan về Getter và Setter trong Python

Các biến private trong Python cũng không thực sự là private giống ngôn ngữ khác.

Getter và setter trong python khi đó thường được sử dụng khi:

  • Sử dụng để kiểm tra tính logic dữ liệu khi get hoặc set
  • Hạn chế việc truy xuất trực tiếp vào các thuộc tính của class.

Sử dụng hàm thông thường để thực hiện hành vi get set

Cũng giống như trong PHP, để tạo ra các getter và setter chúng ta có thể định nghĩa các hàm get và set, ví dụ

# Python program showing a use
# of get() and set() method in
# normal function

class Geek:
	def __init__(self, age = 0):
		self._age = age
	
	# getter method
	def get_age(self):
		return self._age
	
	# setter method
	def set_age(self, x):
		self._age = x

raj = Geek()

# setting the age using setter
raj.set_age(21)

# retrieving age using getter
print(raj.get_age())

print(raj._age)

Kết quả

21
21

Trong đó các hàm get_age() và set_age() chỉ là các hàm thông thường trong python mà thôi.

Sử dụng hàm property để làm getter và setter

Trong python, hàm property() là hàm được xây dựng sẵn để tạo và trả về thuộc tính của đối tượng. Một thuộc tính đối tượng có 3 hàm: getter(), setter() và delete()

hàm property() trong Python sẽ có 4 tham số.

property(fget, fset, fdel, doc)

trong đó

fget là function để lấy giá trị thuộc tính

fset là function để gán giá trị cho thuộc tính

fdel là function để xóa giá trị 1 thuộc tính

doc để tạo docstring cho thuộc tính

Một thuộc tính đối tượng sẽ có phương thức getter(), setter(), delete() để chỉ định fget, fset, fdet. Ví dụ

# Python program showing a
# use of property() function

class Geeks:
	def __init__(self):
		self._age = 0
	
	# function to get value of _age
	def get_age(self):
		print("getter method called")
		return self._age
	
	# function to set value of _age
	def set_age(self, a):
		print("setter method called")
		self._age = a

	# function to delete _age attribute
	def del_age(self):
		del self._age
	
	age = property(get_age, set_age, del_age)

mark = Geeks()

mark.age = 10

print(mark.age)

Kết quả

setter method called
getter method called
10

Trong đoạn code trên chúng ta chỉ in ra mark.age, tuy nhiên do các hàm set_age và get_age được gọi nên các dòng tương ứng được ghi ra.

Sử dụng decorator @property để tạo getter và setter

Chúng ta vừa tìm hiểu về hàm property() để tạo ra các getter và setter. Ngoài ra Python cũng có decorator @property được tích hợp sẵn để làm được việc tương tự.

Mục đích chính của bất kì decorator nào là thay đổi phương thức hoặc thuộc tính của lớp sao cho người sử dụng không cần phải thực hiện bất kì thay đổi nào trong code của họ.

Ví dụ

# Python program showing the use of
# @property

class Geeks:
	def __init__(self):
		self._age = 0
	
	# using property decorator
	# a getter function
	@property
	def age(self):
		print("getter method called")
		return self._age
	
	# a setter function
	@age.setter
	def age(self, a):
		if(a < 18):
			raise ValueError("Sorry you age is below eligibility criteria")
		print("setter method called")
		self._age = a

mark = Geeks()

mark.age = 19

print(mark.age)

Kết quả

setter method called
getter method called
19

Như mã code trên đây sẽ nhìn sáng sủa nhất khi sử dụng @property.

Tổng kết

Đối với Python, chúng ta có nhiều cách khách nhau để tạo getter và setter. Tùy theo thói quen, cũng như phong cách của mỗi người chúng ta có thẻ lựa chọn phương án khác nhau. Tuy vậy dù thực hiện theo bất kì cách nào thì hãy luôn nhớ rằng mục đích chính của getter và setter là để xác thực và đóng gói dữ liệu.

 

 

 

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    Rate this post

    Xem thêm nhiều bài tin mới nhất về Odoo

    Xem thêm