Python教程-Python 中的 Getter 和 Setter
在 Python 中,与其他面向对象编程语言中的 Getter 和 Setter 不同。Getter 和 Setter 的主要用途是确保在面向对象的程序中进行数据封装。与其他面向对象语言不同,Python 中的私有变量并不是隐藏字段。一些面向对象编程语言使用 Getter 和 Setter 方法来进行数据封装。我们希望将对象类的属性隐藏起来,以便其他类的方法不会意外地修改数据。
在面向对象编程语言中,Getter 和 Setter 用于检索和更新数据。Getter 用于检索对象的当前属性值,而 Setter 用于更改对象的属性值。在本文中,我们将讨论 Python 中的 Getter 和 Setter,以及通过示例来说明它们。
什么是 Python 中的 Getter?
Getter 是面向对象编程(OOPS)中用于访问类的私有属性的方法。Python 中的 setattr() 函数对应于 Python 中的 getattr() 函数。它修改对象的属性值。
什么是 Python 中的 Setter?
Setter 是用于设置属性值的方法。它在面向对象编程中非常有用,用于设置类中的私有属性的值。
通常,Getter 和 Setter 主要用于确保面向对象编程中的数据封装。
使用普通函数实现 Getter 和 Setter 行为:
如果我们指定普通的 get() 和 set() 方法来实现 Getter 和 Setter 属性,就不需要特殊的实现。
示例:
让我们通过示例来了解如何使用普通函数来实现 Getter 和 Setter 函数。
class javatiku:
def __init__(self, age = 0):
self._age = age
# using the getter method
def get_age(self):
return self._age
# using the setter method
def set_age(self, a):
self._age = a
John = javatiku()
#using the setter function
John.set_age(19)
# using the getter function
print(John.get_age())
print(John._age)
输出: 执行上述代码后,我们将得到以下输出:
19
19
解释:
要实现此功能,上述代码中的 get age() 和 set age() 函数操作与标准函数相同,不会影响 Getter 和 Setter。Python 有一个独特的函数 property()。
使用 property() 函数实现 Getter 和 Setter 行为
在 Python 中,property() 是一个用于创建和返回属性对象的内置函数。属性对象有三个方法:getter(),setter() 和 delete()。在 Python 中,property() 函数接受四个参数:property(fget, fset, fdel, doc)。fget 函数用于检索属性值。fset 函数用于设置属性的值。fdel 函数用于删除属性的值。属性具有文档字符串。
示例:
让我们通过示例来了解如何使用 property() 函数来实现 Getter 和 Setter 行为。
class javatiku:
def __init__(self):
self._age = 0
# using the get function
def get_age(self):
print("getter method")
return self._age
# using the set function
def set_age(self, y):
print("setter method")
self._age = y
# using the del function
def del_age(self):
del self._age
age = property(get_age, set_age, del_age)
John = javatiku()
John.age = 18
print(John.age)
输出: 执行上述代码后,我们将得到以下输出:
setter method
getter method
18
解释:
在上述程序中,只有一个打印语句。由于调用了 Setter 方法 set age() 和 Getter 方法 get age(),因此输出由三行组成。因此,age 是一个属性对象,有助于保护私有变量的访问安全。
使用 @property 装饰器实现 Getter 和 Setter 行为
我们在上一种方法中使用了 property() 函数来实现 Getter 和 Setter 行为。然而,正如本文中之前提到的,Getter 和 Setter 也用于验证属性值的获取和设置。还可以通过使用装饰器来强制属性函数的方法。@property 是 Python 的内置装饰器之一。任何装饰器的主要目标是修改类方法或属性,以便类用户无需更改其代码。
示例:
让我们通过示例来了解如何使用 @property 装饰器来实现 Getter 和 Setter 行为。
class javatiku:
def __init__(self):
self._age = 0
# using the getter function
@property
def age(self):
print("getter method")
return self._age
#now, using the setter function
@age.setter
def age(self, x):
if(x < 20):
raise ValueError("the age is below eligibility criteria")
print("setter method")
self._age = x
John = javatiku()
John.age = 25
print(John.age)
输出: 执行上述代码后,我们将得到以下输出:
setter method called
getter method called
25
解释:
上面的代码演示了如何使用 @property 装饰器 来创建 Python 风格的 Getter 和 Setter。上面的示例作为验证代码,如果我们尝试使用小于 20 的值初始化年龄,将引发 ValueError。
将属性设置为私有
现在,我们将看到如何将方法设置为私有,以便外部调用函数无法操作其中的变量。只有类内定义的函数才能操作它们。通过在方法名前面加上两个下划线来将它们设置为私有。
示例:
让我们通过示例了解如何在程序中将属性设置为私有。
class javatiku:
def __init__(self, age=49):
self._age = age
# make the getter method
def get_age(self):
return self.__age
# make the setter method
def set_age(self, a):
self.__age = a
grad_obj = javatiku()
print(grad_obj._age)
# Before using setter
print(grad_obj.get_age())
# After using setter
grad_obj.set_age(2020)
print(grad_obj._age)
输出: 执行上述代码后,我们将得到以下输出:
49
从私有方法读取值
要从私有方法中读取值,我们必须使用 Getter 方法。如果不使用 Getter 方法,则无法使用属性方法来访问私有属性值。让我们通过示例来了解这个方法。
示例:
# A program to read the value from private method
class javatiku:
def __init__(self, year=27):
self._year = year
@property
def Aboutyear(self):
return self.__year
@Aboutyear.setter
def Aboutyear(self, x):
self.__year = x
grad_obj = javatiku()
print(grad_obj._year)
grad_obj.year = 2020
print(grad_obj.year)
输出: 执行上述代码后,我们将得到以下输出:
27
2020
示例:
让我们来看另一个创建具有属性的类的示例。从该类中,我们可以创建多个对象。
class javatiku:
def __init__(self):
self.emp = "None"
Mark = Friend()
John = Friend()
这些对象上尚未设置属性 (Emp)。我们可以直接设置它,但这不是一个好方法。相反,我们构建了两个方法:getEmp() 和 setEmp()。
class javatiku:
def __init__(self):
self.emp = "None"
def getEmp(self):
return self.emp
def setEmp(self, emp):
self.emp = emp
Mark = javatiku()
John = javatiku()
Mark.setEmp("Developer")
John.setEmp("Designer")
print(John.emp)
print(Mark.emp)
输出: 执行上述代码后,我们将获得如下输出:
输出为:
Designer
Developer