2012-06-12 30 views
5

Mã này tạo ra một đầu ra khác nhau trong Python 2Python 3.Mô tả Python không hoạt động trong 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') 

Kết quả cho Python 2 là:

read 
read 
finished 

Đối với Python 3 đó là:

read 
write 
del 
read 
finished 

Tại sao điều này làm việc theo cách này? Các mô tả Python 2 khác với các mô tả Python 3 như thế nào?

này cũng làm cho không có ý nghĩa, bởi vì http://docs.python.org/release/3.0.1/reference/datamodel.html#invoking-descriptors mô tả rõ ràng chính xác giống như http://docs.python.org/reference/datamodel.html#invoking-descriptors

(Đây là những tài liệu cho Python 2.7Python 3.0.)

+0

(BTW, Python 3.0 và tài liệu hướng dẫn của nó là lỗi thời và đã về hưu, không sử dụng Python 3.0 hoặc 3.0.1 Các tài liệu hiện nay tại http:. // docs. python.org/py3k/ và bản phát hành hiện tại là 3.2.3.) –

Trả lời

5

Edit: Theo Ned Deily chính xác chỉ ra trong các ý kiến , lý do điều này xảy ra là lớp học của bạn C là một lớp kiểu cũ trên Python 2, vì bạn chưa chỉ định object hoặc một lớp kiểu mới làm lớp cơ sở của nó.


Bởi vì trên Python 2, bạn đang tạo ra một trường hợp mới thuộc tính c.a khi bạn làm c.a = 3 mà giấu các đối tượng mô tả tọa lạc tại C.a.

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

cho:

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

Nhưng điều này có nghĩa là, tôi không thể sử dụng __set__ descriptors trong python 2. Và tại sao điều này lại khác trong Python 3? –

+9

Lớp C của bạn là một lớp kiểu cũ trong Python 2. Thay đổi nó thành 'Class C (đối tượng)' và Py 2 hoạt động giống như Py 3. –

+0

dammit! xin lỗi vì đã đăng câu hỏi này. :-) Tôi đã thay đổi 'Descriptor' thành một lớp kiểu mới, nhưng chưa thấy rằng' C' không phải là một lớp kiểu mới. Cảm ơn bạn Ned. –