在面向对象的程序中使用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函数中应用任何类型的验证。