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')

Python2の出力は次のとおりです。

read
read
finished

Python3の場合は次のとおりです。

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 に答える