本文次要内容:
  1. 解释setter和getter的应用办法
  2. 解释@property装璜器的妙用

    在python中,setter和getter办法并不像其它编程语言中的那样。基本上,在面向对象编程语言中,应用setter和getter办法的次要目标是为了确保数据的封装。不像其它面向对象编程语言,python中的公有变量并不是真正的暗藏字段。在python中,通常在以下状况会用到setter和getter办法:

  • 在获取或者设置属性值的时候应用setter和getter办法为其增加验证逻辑
  • 防止对类的某些字段间接拜访,比方类的公有变量不应该被内部调用者直击拜访或者批改

应用一般函数实现setter和getter办法
要实现setter和getter属性,只是定义一般办法get()和set()并不能反产生任何非凡的行为,例如:

class Student(object):    def __int(self, age=0):        self._age = age        # getter办法    def get(self):        return self._age        # setter办法    def set(self, value):        self._age = value        xiaoming = Student()# 应用setter办法设置agexiaoming.set(20)# 应用getter办法返回ageprint(xiaoming.get())print(xiaoming._age)

输入:

2020

在下面代码中,set_age()和get_age()办法与一般办法并没有什么两样,那么如何实现像getter和setter一样的性能呢?这就要用到python中的非凡办法property()。
应用property()办法来实现setter和getter的行为
property()是python中的一个内置办法,它创立并返回一个属性对象。一个属性对象有三个办法,getter()、setter()和delete()。property()内置办法有四个参数,property(fget,fset, fdel, doc)。fget是一个用于获取属性值的函数,fset是一个用于设置属性值的函数,fdel是一个用于删除属性的函数,doc用于为属性创立文档阐明。一个属性兑现有三个办法,getter()、setter()和delete()别离制订fget、fset、fdel。

class Adult(object):    def __int(self):        self.__age = 0        # 获取属性_age的值    def get_age(self):        print('getter() method called')        return self.__age        # 设置属性_age的值    def set_age(self, value):        print('setter() method called')        self.__age = value        # 删除属性_age    def del_age(self):        del self.__age            age = property(get_age, set_age, del_age)laowang = Adult()laowang.age = 60print(laowang.age)

输入:

setter() method calledgetter() method called60

在下面的代码中,age就是一个属性对象,它保障了对公有变量的平安拜访。
应用@property装璜器来实现setter和getter的行为
除了下面应用property()的办法来实现getter、setter办法的行为,在python中还能够装璜器@property来实现。@property是python的一个内置装璜器,应用装璜器的目标是扭转类的办法或者属性,这样调用者就无需在代码中做任何改变。

class Adult(object):        def __init__(self):        self.__age = 0        @property    def age(self):        print('getter() method called')        return self.__age            @age.setter    def age(self, value):        if value < 18:            raise ValueError('Sorry, you are a child, games not allowed')        print('setter() method called')        self.__age = value        xiaoli = Adult()xiaoli.age = 19print(xiaoli.age)

输入:

setter() method calledgetter() method called19

下面的代码清晰地展现了如何用pythonic的形式应用@property装璜器实现setter和getter属性。同时实现了对属性赋值时的有效性查看。