5

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 的输出是:

read
read
finished

对于 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.7Python 3.0

4

1 回答 1

5

编辑:正如 Ned Deily 在评论中准确指出的那样,发生这种情况的原因是您的类C是 Python 2 上的旧式类,因为您没有指定object或另一个新式类作为其基类。


因为在 Python 2 上,当您创建一个新的实例属性c.a时,c.a = 3它会隐藏位于C.a.

c = C()
c.a
c.a = 3
print c.__dict__['a']
print C.__dict__['a']
del c.a
c.a

给出:

read
3
<__main__.Descriptor object at 0x04625570>
read
finished
于 2012-06-12T23:45:52.893 回答