正文
_name
class
Person
(
object
)
:
name
=
Descriptor
()
使用这些代码并查看输出:
>>>
user
=
Person
()
>>>
user
.
name
=
'john smith'
Setting
:
john
smith
>>>
user
.
name
Getting
:
John
Smith
'John Smith'
>>>
del
user
.
name
Deleting
:
John
Smith
通过以下方法覆盖父类的 __set__()、__get__() 和 __delete__() 方法,创建一个描述符类:
-
get 将输出 Getting
-
delete 将输出 Deleting
-
set 将输出 Setting
并在分配之前将属性值修改为标题(第一个字母大写,其他字母为小写)。这样做有助于存储和输出名称。
大写转换同样可以移动到 __get__() 方法。_value 有一个初始值,并根据 get 请求转换为标题。
使用属性类型创建描述符
虽然 清单 2 中定义的描述符是有效的且可以正常使用,但是还可以使用属性类型的方法。通过使用 property(),可以轻松地为任意属性创建可用的描述符。创建 property() 的语法是 property(fget=None, fset=None, fdel=None, doc=None),其中:
-
fget:属性获取方法
-
fset:属性设置方法
-
fdel:属性删除方法
-
doc:docstring
使用属性重写该例子,如 清单 3 所示。
清单 3. 使用属性类型创建描述符
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
,