解答三个问题,描述是什么?如何实现?使用场景?
一、什么是描述符
描述符就是一个具有绑定行为的对象属性,其属性访问将由描述符协议中的方法覆盖。这些方法为 __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
搜索关注微信公众号:寸土币争 ID: bbcoins
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。