分享

技术图文:Python属性装饰器详解

 老马的程序人生 2020-08-17

背景

我们在以前的一篇图文 Python基础 -- Task10. 类与对象 中介绍过利用property()方法既能保护类的封装特性,又能让开发者可以使用“对象.属性”的方式操作类属性。

class property([fget[, fset[, fdel[, doc]]]])

用于在新式类中返回属性值。
fget -- 获取属性值的函数
fset -- 设置属性值的函数
fdel -- 删除属性值函数
doc -- 属性描述信息

并在图文 Python魔法方法之属性访问详解 中详细介绍了property()方法的实现机理。

除了使用property()方法外,Python还提供了属性装饰器。通过这些属性装饰器,可以直接利用方法名来访问方法,不需要在方法名后添加一对“()”小括号。

@property
def 方法名(self)
    代码块

@方法名.setter
def 方法名(self, value):

    代码块

@方法名.deleter
def 方法名(self):
    代码块    

代码演示

1. Python属性装饰器举例

class People:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age if age > 0 else 0

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        if isinstance(age, int):
            self.__age = age if age > 0 else 0
        else:
            raise ValueError

    @age.deleter
    def age(self):
        print('删除年龄数据!')


obj = People('jack'18)
print(obj.age) # 获取值
obj.age = 19 # 重新赋值
print('obj.age:', obj.age)
del obj.age # 删除属性

# 18
# obj.age: 19
# 删除年龄数据!
  • @property装饰器

上例中的第一个age(self)方法,这样就使得该方法变成了age属性的getter方法。需要注意的是,如果类中只包含该方法,那么age属性将是一个只读属性。

  • @xxx.setter装饰器

上例中的第二个age(self, age)方法,这样就使得该方法变成了age属性的setter方法,提供赋值功能。

  • @xxx.delete装饰器

上例子中第三个age(self)方法,这样就使得该方法变成了age属性的deleter方法,用于删除功能。

2. 使用property()函数

class People:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age if age > 0 else 0

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if isinstance(age, int):
            self.__age = age if age > 0 else 0
        else:
            raise ValueError

    def del_age(self):
        print("删除年龄数据!")

    age = property(get_age, set_age, del_age, "年龄")


obj = People('jack'18)
print(obj.age)
obj.age = 19
print('obj.age:', obj.age)
del obj.age

# 18
# obj.age: 19
# 删除年龄数据!

总结

本图文介绍了Python中三种属性装饰器,并通过案例演示了这三种属性装饰器的使用方法,并利用property()方法实现了相同的功能。今天就到这里吧!See You!


参考文献

  • http://c./view/4561.html

  • http://www./course/python/


    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多