Python中的Getter和Setter -GeeksforGeeks


在面向对象的程序中使用getter和setter的主要目的是确保数据封装。像其他面向对象的语言一样,python中的私有变量实际上并不是隐藏字段。在以下情况下,通常使用python中的Getter和Setters:

  • 我们使用getters和setters在获取和设置值周围添加验证逻辑。
  • 为了避免直接访问类字段,即私有变量不能直接访问或不能由外部用户修改。

 
通常方法
要获得getters和setters属性,如果我们定义normal get()和set()method,没有任何特殊的实现。例如


# Python program showing a use 
# of get() and set() method in 
# normal function 
  
class Geek: 
    def __init__(self, age = 0): 
         self._age = age 
      
    # getter method 
    def get_age(self): 
        return self._age 
      
    # setter method 
    def set_age(self, x): 
        self._age = x 
  
raj = Geek() 
  
# setting the age using setter 
raj.set_age(21) 
  
# retrieving age using getter 
print(raj.get_age()) 
  
print(raj._age) 

 
使用property()函数实现
在Python中property()是一个内置函数,可创建并返回属性对象。属性对象具有三种方法,getter(),setter()和delete()。property() Python中的function有四个参数property(fget, fset, fdel, doc),fget是用于检索属性值的函数。fset是用于设置属性值的功能。fdel是删除属性值的功能。doc为属性创建一个文档字符串。对象的属性有三种方法,getter(),setter(),和delete()指定fget,fset并fdel独立。

# Python program showing a 
# use of property() function 
  
class Geeks: 
     def __init__(self): 
          self._age = 0
       
     # function to get value of _age 
     def get_age(self): 
         print("getter method called"
         return self._age 
       
     # function to set value of _age 
     def set_age(self, a): 
         print(
"setter method called"
         self._age = a 
  
     # function to delete _age attribute 
     def del_age(self): 
         del self._age 
     
    [b] age = property(get_age, set_age, del_age)  [/b]
  
mark = Geeks() 
  
mark.age = 10
  
print(mark.age) 

 
使用@property装饰器
Python @property是内置装饰器之一。任何装饰器的主要目的是以这种方式更改类的方法或属性,以使类的用户无需对其代码进行任何更改。例如


# Python program showing the use of 
# @property 
  
class Geeks: 
     def __init__(self): 
          self._age = 0
       
     # using property decorator 
     # a getter function 
     @property
     def age(self): 
         print("getter method called"
         return self._age 
       
     # a setter function 
     @age.setter 
     def age(self, a): 
         if(a < 18): 
            raise ValueError(
"Sorry you age is below eligibility criteria"
         print(
"setter method called"
         self._age = a 
  
mark = Geeks() 
  
mark.age = 19
  
print(mark.age) 

在上面的代码中,很清楚如何使用@property装饰器以pythonic方式创建getter和setter。可以在getter或setter函数中应用任何类型的验证。