Python 装饰器之 Property: Setter 和 Getter

一、什么是setter,getter

@property的实现比较复杂,我们先考察如何使用。

把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作.

refer to:https://www.geeksforgeeks.org/getter-and-setter-in-python/

二、使用场景

Case1:对属性的赋值做判断和异常检测

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 # setting the age using setter


if __name__ == '__main__':
    g = Geeks()
    age_before_set = g.age
    print(age_before_set)  # 0
    g.age = 19
    age_after_set = g.age
    print(age_after_set)  # 19

 

Case2:将 setter 和 getter 作为私有方法隐藏起来

class FinalClass:

    def __init__(self, var):
        ## calling the set_a() method to set the value 'a' by checking certain conditions
        self.__set_a(var)

    ## getter method to get the properties using an object
    def __get_a(self):
        return self.__a

    ## setter method to change the value 'a' using an object
    def __set_a(self, var):

        ## condition to check whether var is suitable or not
        if var > 0 and var % 2 == 0:
            self.__a = var
        else:
            self.__a = 2

    a = property(__get_a, __set_a)

Case3:多种属性之间的动态依赖关系

refer to:https://iphysresearch.github.io/blog/post/programing/python/property_setter/

 

上一篇:mysql实用sql语句整理


下一篇:C# 通过反射实现复杂对象的深拷贝(附源码)