【发布时间】:2015-05-19 01:12:42
【问题描述】:
它们都是来自文档的python:
如果一个对象同时定义了
__get__()和__set__(),它被认为是一个数据描述符。 只定义__get__()的描述符称为非数据描述符 (它们通常用于方法,但也可以用于其他用途)。
如果描述符定义了
__set__()和/或__delete__(),它是一个数据描述符;如果两者都没有定义,则它是非数据描述符。 通常,数据描述符定义__get__()和__set__(),而非数据描述符只有__get__()方法。
问题是:只定义__set__ 来制作数据描述符是否足够?
而我们我参考了python源代码,我发现了这个:
#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL)
看来我们只能定义__set__ 而没有__get__。
然后我转而写一些例子来证明我得到了什么:
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__ ---> 数据描述符?
【问题讨论】:
-
您的两个链接都指向同一个页面。
标签: python python-3.4