Python描述符在python2.7中不起作用

2024-04-27 01:05:01 发布

您现在位置:Python中文网/ 问答频道 /正文

此代码在Python 2Python 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.7Python 3.0的文档。)


Tags: instanceorgselfhttpdocsreaddef描述符
1条回答
网友
1楼 · 发布于 2024-04-27 01:05:01

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


因为在python2上,当您创建一个新的实例属性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

给出:

^{pr2}$

相关问题 更多 >