在 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

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程