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