Python中的Getter和Setter


为了实现数据封装的目的,大多数面向对象的语言都使用getter和setter方法。这是因为我们希望将对象类的属性隐藏起来,以免其他类的其它方法意外修改数据。

顾名思义,getter方法用于访问私有属性或获取私有属性的值,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语句给出私有属性的默认值。

使用getter和setter

在下面的示例中,我们将创建一个类,初始化它,然后为每个属性添加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

将属性设为私有

在接下来的示例中,我们将看到如何将方法设为私有,以便外部调用函数无法操作其中的变量。它们只能由类内部的函数操作。通过在它们前面加上两个下划线,可以将它们设为私有。

示例

 在线演示

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'

从私有方法读取值

现在,我们可以使用property方法,无需使用getter方法即可访问私有属性值。

示例

 在线演示

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

更新于:2020年1月2日

15K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.