2012-06-12 66 views
5

此代碼在Python 2Python 3中產生不同的輸出。Python描述符無法在Python 2.7中工作

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本細則。)

+0

(順便說一句,Python的3.0和它的文檔是過時的和退休的;不要使用Python 3.0或3.0.1當前文檔是在http://文檔。 python.org/py3k/和當前版本是3.2.3) –

回答

5

編輯:斯內德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 
+1

但是這意味着,我不能在Python 2中使用__set__描述符。爲什麼Python 3中的這個不同? –

+9

您的C類是Python 2中的舊式類。將其更改爲「Class C(object)」,並且Py 2與Py 3的作用相同。 –

+0

dammit!抱歉甚至發佈這個問題。 :-)我把'Descriptor'改成了一個新的風格類,但是還沒有看到'C'不是一個新風格的類。謝謝你奈德。 –