此代码在Python 2
和Python 3
中生成不同的输出。在
class Descriptor(object):
def __get__(self, instance, owner):
print('read')
return 1
def __set__(self, instance, value):
print('write')
def __delete__(self, instance):
print('del')
class C():
a = Descriptor()
c = C()
c.a
c.a = 3
del c.a
c.a
print('finished')
Python 2的输出是:
^{pr2}$对于Python 3,它是:
read
write
del
read
finished
为什么这样工作?Python 2
描述符与Python 3
描述符有何不同?在
这也没有意义,因为http://docs.python.org/release/3.0.1/reference/datamodel.html#invoking-descriptors清楚地描述了与 http://docs.python.org/reference/datamodel.html#invoking-descriptors
(这些是Python 2.7
和Python 3.0
的文档。)
编辑:正如Ned Deily在评论中准确指出的那样,发生这种情况的原因是您的类
C
是Python2上的一个旧样式的类,因为您没有指定object
或其他新样式的类作为基类。在因为在python2上,当您创建一个新的实例属性
c.a
时,c.a = 3
隐藏位于C.a
的描述符对象。在给出:
^{pr2}$相关问题 更多 >
编程相关推荐