推荐本人的《Python 自动化运维实战》课程,提供在线实验环境,边敲代码边学习。解答三个问题,描述是什么?如何实现?使用场景?一、什么是描述符描述符就是一个具有绑定行为的对象属性,其属性访问将由描述符协议中的方法覆盖。这些方法为 getsetdelete。如果这些方法中的任何一个针对某个对象定义,那么它就被认为是一个描述符。get 用于访问属性。它返回属性的值,或者在所请求的属性不存在的情况下出现 AttributeError 异常__set__ 将在属性分配操作中调用。不会返回任何内容__delete__ 控制删除操作。不会返回内容二、描述符的实现方式2.1 基于类创建#!/usr/bin/env python# -- coding:utf-8 --# author = ’liao gao xiang’class Descriptor(object): """""" def init(self): self._name = ’’ def get(self, instance, owner): print("get") return self._name def set(self, instance, value): print("set") self._name = value def delete(self, instance): print("delete") del self._nameclass Person(object): name = Descriptor() p = Person()print(p.name)p.name = ’liao gao xiang’del p.name# print(p.name)2.2 使用propety()函数#!/usr/bin/env python# -- coding:utf-8 --# author = ’liao gao xiang’class Person(object): def init(self): self._name = ’’ def fget(self): print(“Getting: %s” % self._name) return self._name def fset(self, value): print(“Setting: %s” % value) self._name = value.title() def fdel(self): print(“Deleting: %s” % self._name) del self._name name = property(fget, fset, fdel, “I’m the property.")p = Person()print(p.name)p.name = ’liao gao xiang’del p.name# print(p.name)2.3 使用@property装饰器#!/usr/bin/env python# -- coding:utf-8 --# author = ’liao gao xiang’class Person(object): "”"""" def init(self, name): self._name = name @property def name(self): print(“get_name”) return self._name @name.setter def name(self, value): print(“set_name”) self._name = value @name.deleter def name(self): print(“del_name”) del self._name p = Person()print(p.name)p.name = ’liao gao xiang’del p.name# print(p.name)三、描述符的使用场景通过结合使用描述符,可以实现优雅的编程,允许创建 Setters 和 Getters 以及只读属性根据值或类型请求进行属性验证大量用于各种框架中,比如Django的models