这两个文档都是关于Python的:
第一个文档中说:
如果一个对象同时定义了
__get__()
和__set__()
,则被认为是数据描述符。 只定义了__get__()
的描述符称为非数据描述符(通常用于方法,但也可能有其他用途)。
第二个文档中说:
如果描述符定义了
__set__()
和/或__delete__()
,则它是数据描述符;如果它没有定义,则为非数据描述符。 通常,数据描述符同时定义了__get__()
和__set__()
,而非数据描述符只有__get__()
方法。
问题是:仅定义 __set__
是否足以使描述符成为数据描述符?
当我查阅Python源代码时,发现以下内容:
#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL)
看起来我们只能定义没有 __get__
的 __set__
。
接下来我会写一些示例来证明我的观点:
class GetSet(object):
def __get__(self, instance, cls =None):
print('__get__')
def __set__(self, obj, val):
print('__set__')
class Get(object):
def __get__(self, instance, cls =None):
print('__get__')
class Set(object):
def __set__(self, obj, val):
print('__set__')
class UserClass(object):
a = Get()
b = Set()
c = GetSet()
u = UserClass()
u.__dict__['a'] = 'a'
u.__dict__['b'] = 'b'
u.__dict__['c'] = 'c'
print('start')
print(u.a)
print(u.b)
print(u.c)
输出结果又让我感到困惑了:
start
a
b
__get__
None
根据Python属性查找顺序:数据描述符的优先级高于
obj.__dict__
。我的例子表明:只有同时定义了
__set__
和__get__
才能将其视为数据描述符!哪个答案是正确的?
__set__
--> 数据描述符还是
__get__
和__set__
--> 数据描述符?