关于python:python的getter和setter方法的使用详解

2次阅读

共计 1970 个字符,预计需要花费 5 分钟才能阅读完成。

本文次要内容:
  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 办法设置 age
xiaoming.set(20)
# 应用 getter 办法返回 age
print(xiaoming.get())
print(xiaoming._age)

输入:

20
20

在下面代码中,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 = 60
print(laowang.age)

输入:

setter() method called
getter() method called
60

在下面的代码中,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 = 19
print(xiaoli.age)

输入:

setter() method called
getter() method called
19

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

正文完
 0