关于python描述符的几点澄清
有人能举个例子帮我理解吗 如果实例的字典中有与数据描述符同名的条目,则数据描述符优先。如果实例的字典有一个与非数据描述符同名的条目,则字典条目优先 该实现通过一个优先级链工作,该优先级链将数据描述符的优先级指定给实例变量,实例变量的优先级指定给非数据描述符,并将最低优先级指定给uGetAttr(如果提供) 具体来说,我不明白的是:关于python描述符的几点澄清,python,Python,有人能举个例子帮我理解吗 如果实例的字典中有与数据描述符同名的条目,则数据描述符优先。如果实例的字典有一个与非数据描述符同名的条目,则字典条目优先 该实现通过一个优先级链工作,该优先级链将数据描述符的优先级指定给实例变量,实例变量的优先级指定给非数据描述符,并将最低优先级指定给uGetAttr(如果提供) 具体来说,我不明白的是: 一个实例的字典怎么可能有一个与描述符同名的条目。你能给我举个例子吗 另外,你能给我一个例子,其中数据描述符优先于实例变量,实例变量优先于非数据描述符,等等 同样,在下
#! /usr/bin/env python
class descclass(object):
def __init__(self, value):
print "in desc init"
self.value = value
print "out of desc init"
def __get__(self, inst, insttype):
print "in desc get"
return self.value
def __set__(self,inst, val):
print "in desc set"
self.value = val
class testclass(object):
x = descclass(100)
print "desc created"
def __init__(self, val):
print "in testclass init"
self.x = val # this invokes __set__ on descriptor in x
print "out of testclass init"
if __name__ == '__main__':
t = testclass(45)
print t.x
print vars(t)
print vars(testclass)
这里有一个例子
# Not a data descriptor because it doesn't define __set__
class NonDataDescriptor(object):
def __get__(self, obj, objtype):
return 3
class Namespace(object):
# Data descriptor - defines both __get__ and __set__
@property
def foo(self):
return 3
bar = NonDataDescriptor()
x = Namespace()
x.__dict__['foo'] = 4 # We bypass the foo descriptor's __set__ here,
x.bar = 4 # but there's no bar setter, so this one goes to the dict
# x now has foo and bar descriptors and __dict__ entries
print x.foo # prints 3 - data descriptor wins over instance __dict__ entry
print x.bar # prints 4 - instance __dict__ entry wins over non-data descriptor
这里有一个例子
# Not a data descriptor because it doesn't define __set__
class NonDataDescriptor(object):
def __get__(self, obj, objtype):
return 3
class Namespace(object):
# Data descriptor - defines both __get__ and __set__
@property
def foo(self):
return 3
bar = NonDataDescriptor()
x = Namespace()
x.__dict__['foo'] = 4 # We bypass the foo descriptor's __set__ here,
x.bar = 4 # but there's no bar setter, so this one goes to the dict
# x now has foo and bar descriptors and __dict__ entries
print x.foo # prints 3 - data descriptor wins over instance __dict__ entry
print x.bar # prints 4 - instance __dict__ entry wins over non-data descriptor
描述符总是类的一部分;实例有自己的属性,通常它们优先于类上的任何属性 数据描述符只是具有
\uuuu get\uuuu
和\uuu set\uuu
方法的描述符。Python就是这样做的:
第3点。四,。其实是一回事;描述符是具有特定方法的类属性;因此,当属性上没有描述符挂钩时,第4点实际上就是第3点。描述符总是类的一部分;实例有自己的属性,通常它们优先于类上的任何属性 数据描述符只是具有
\uuuu get\uuuu
和\uuu set\uuu
方法的描述符。Python就是这样做的:
第3点。四,。其实是一回事;描述符是具有特定方法的类属性;因此,当属性上没有描述符挂钩时,第4点实际上就是第3点。请修改第3点,将其称为非数据描述符。这不是更有意义吗?在上面的文档中,实例变量实际上意味着实例属性。对吗?请修改#3以表示非数据描述符。这不是更有意义吗?在上面的文档中,实例变量实际上意味着实例属性..对吗?那么在上面的文档中,实例变量实际上意味着实例属性..对吗?@abc:它指的是实例的
\uu dict\uu
中的条目。我不相信这是标准或明确的术语;可能措辞会更好。谢谢你的澄清。接受这一点是因为您给出了示例代码。你也可以得到一个更好的stackoverflow句柄。我可以,但是当我看到我的自动生成句柄非常接近初始素数序列时,我无法改变它。完全不明显。但是什么是素数的初始序列呢?所以在上面的文档中,实例变量实际上意味着实例属性..对吗?@abc:它指的是实例的\uuuu dict\uuu
中的条目。我不相信这是标准或明确的术语;可能措辞会更好。谢谢你的澄清。接受这一点是因为您给出了示例代码。你也可以得到一个更好的stackoverflow句柄。我可以,但是当我看到我的自动生成句柄非常接近初始素数序列时,我无法改变它。完全不明显。但什么是素数的初始序列呢?