2012-06-12 25 views
5

Ten kod wytwarza inne wyjście w postaci Python 2 i Python 3.Deskryptory w języku Python nie działają w języku 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') 

Wyjście dla Pythona 2 jest:

read 
read 
finished 

dla Pythona 3 to:

read 
write 
del 
read 
finished 

Dlaczego to działa w ten sposób? Czym różnią się deskryptory Python 2 od deskryptorów ?

To również sprawia, że ​​nie ma sensu, ponieważ http://docs.python.org/release/3.0.1/reference/datamodel.html#invoking-descriptors jasno opisuje dokładnie takie same jak http://docs.python.org/reference/datamodel.html#invoking-descriptors

(Są dokumentacje dla Python 2.7 i Python 3.0.)

+0

(BTW, Python 3.0 i jego dokumentacja są przestarzałe i na emeryturze, nie używać Pythona 3.0 lub 3.0.1 Obecne docs są na stronie http:. // docs. python.org/py3k/ i obecna wersja to 3.2.3.) –

Odpowiedz

5

Edit: Jak Ned Deily trafnie zwraca uwagę w komentarzach , tak się dzieje, to jest Twoja klasa jest klasą w starym stylu na Pythonie 2, ponieważ nie określiłeś object lub innej klasy w nowym stylu jako klasy podstawowej.


Ze względu na Pythonie 2, tworzysz nową instancję atrybutu c.a kiedy robisz c.a = 3 który ukrywa obiekt znajdujący się C.a deskryptora.

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

daje:

read 
3 
<__main__.Descriptor object at 0x04625570> 
read 
finished 
+1

Ale to by znaczyło, nie mogłem używać deskryptorów __set__ w Pythonie 2. I dlaczego jest inaczej w Pythonie 3? –

+9

Twoja klasa C jest klasą w starym stylu w Pythonie 2. Zmień ją na 'Klasa C (obiekt)', a Py 2 działa tak samo jak Py 3. –

+0

Psujcie się! przepraszam, że nawet wysłałem to pytanie. :-) Zmieniłem deskryptor 'na nową klasę stylu, ale nie widziałem, że' C' nie jest nową klasą stylu. Dziękuję Ned. –