Đóng gói dữ liệu: getter truy cập thuộc tính private, setter thay đổi giá trị. Python dùng underscore đơn (_) hoặc kép (__) để chỉ private.
Truy cập thuộc tính private
Tạo class, khởi tạo, truy cập trực tiếp thuộc tính _year.
Ví dụ
class year_graduated:
def __init__(self, year=0):
self._year = year
grad_obj = year_graduated()
print(grad_obj)
print(grad_obj.year) Đầu ra
<__main__.year_graduated object at 0x00F2DD50> 0
Dùng getter và setter
Định nghĩa get_year(), set_year().
Ví dụ
class year_graduated:
def __init__(self, year=0):
self._year = year
def get_year(self):
return self._year
def set_year(self, a):
self._year = a
grad_obj = year_graduated()
print(grad_obj.get_year())
grad_obj.set_year(2019)
print(grad_obj._year) Đầu ra
0 2019
Làm thuộc tính thực sự private (__)
Prefix __year, truy cập qua getter/setter. Python name mangling.
Ví dụ
class year_graduated:
def __init__(self, year=32):
self._year = year
def get_year(self):
return self.__year
def set_year(self, a):
self.__year = a
grad_obj = year_graduated()
print(grad_obj._year)
print(grad_obj.get_year())
grad_obj.set_year(2019)
print(grad_obj._year) Đầu ra
32 AttributeError: 'year_graduated' object has no attribute '_year_graduated__year'
Dùng property decorator
@property cho getter, @name.setter cho setter, truy cập như thuộc tính.
Ví dụ
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) Đầu ra
32 2018