在Python中的Getter和Setter

在Python中的Getter和Setter

在Python中,Getter和Setter与其他面向对象编程的语言不同。Getter和Setter的主要用途是确保对象导向程序中的数据封装。与其他面向对象的语言不同,在Python中,私有变量不是隐藏字段。一些面向对象的语言使用Getter和Setter方法来进行数据封装。我们希望将一个对象类的属性隐藏起来,以防止其他类中的方法意外修改数据。

在面向对象编程语言中,Getter和Setter用于检索和更新数据。Getter用于获取对象的当前属性值,而Setter用于更改对象的属性值。在本文中,我们将讨论Python中的Getter和Setter,并提供示例。

Python中的Getter是什么

Getter是用于访问类的私有属性的方法。Python中的 setattr() 函数对应于Python中的 getattr() 函数。它改变了对象的属性值。

Python中的Setter是什么

Setter是用于设置属性值的方法。在面向对象编程中,它非常有用,用于设置类的私有属性的值。

通常情况下,Getter和Setter主要用于确保面向对象编程中的数据封装。

使用普通函数实现Getter和Setter行为

如果我们指定普通的 get()set() 方法来实现Getter和Setter属性,则不会有特殊的实现。

示例:

让我们通过一个示例来理解如何使用普通函数来实现Getter和Setter函数。

class Javatpoint: 
    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 = Javatpoint() 

#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函数用于删除属性的值。通过doc参数给属性添加一个文档字符串。

示例:

让我们通过一个示例来了解如何使用property()函数实现getter和setter的行为。

class Javatpoint: 
     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 = Javatpoint() 

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 Javatpoint: 
     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 = Javatpoint() 

John.age = 25

print(John.age) 

输出: 在执行以上代码后,我们将得到如下所示的输出:

输出为:

setter method called
getter method called
25

解释:

上述代码演示了如何使用@property装饰器构建Python风格的getter和setter。上述示例作为验证代码,如果我们尝试用小于20的值初始化年龄,则引发ValueError。

将属性设为私有

现在,我们将看到如何使方法私有,以便外部调用的函数不能操作其中的变量。它们只能被类内定义的函数操作。通过在前面添加两个下划线来将它们设为私有。

示例:

让我们通过一个示例来了解如何在程序中将属性设为私有。

class Javatpoint:
   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 = Javatpoint()
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 Javatpoint:
   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 = Javatpoint()
print(grad_obj._year)

grad_obj.year = 2020
print(grad_obj.year)

输出: 在执行上面的代码之后,我们将得到如下所示的输出:

输出是:

27
2020

示例:

让我们来看另一个示例,创建一个具有属性的类。从这个类中我们可以创建多个对象。

class Javatpoint:    
    def __init__(self):
        self.emp = "None"
Mark = Friend()
John = Friend()

该对象上未设置属性 (Emp) 。我们可以直接设置它,但这不是一种好的方法。我们相反构造了两个方法: getEmp()setEmp()

class Javatpoint:
    def __init__(self):
        self.emp = "None"
    def getEmp(self):
        return self.emp
    def setEmp(self, emp):
        self.emp = emp
Mark = Javatpoint()
John = Javatpoint()
Mark.setEmp("Developer")
John.setEmp("Designer")
print(John.emp)
print(Mark.emp)

输出: 在执行上面的代码之后,我们将得到如下所示的输出:

输出是:

Designer
Developer

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程