乐趣区

Python中的描述符

推荐本人的《Python 自动化运维实战》课程,提供在线实验环境,边敲代码边学习。
解答三个问题,描述是什么?如何实现?使用场景?
一、什么是描述符
描述符就是一个具有绑定行为的对象属性,其属性访问将由描述符协议中的方法覆盖。这些方法为 __get__、__set__ 和 __delete__。如果这些方法中的任何一个针对某个对象定义,那么它就被认为是一个描述符。
__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._name

class 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

退出移动版