2013-03-17 29 views
16

Tôi đang cố định nghĩa một lớp có thuộc tính chỉ đọc trong một Python; Tôi đi theo tài liệu Python và đã đưa ra đoạn mã sau:python - tại sao thuộc tính chỉ đọc có thể ghi được?

#!/usr/bin/python 

class Test: 
     def __init__(self, init_str): 
       self._prop = init_str 

     @property 
     def prop(self): 
       return self._prop 

t = Test("Init") 
print t.prop 
t.prop = "Re-Init" 
print t.prop 

Bây giờ khi tôi cố gắng để thực thi mã mặc dù tôi đang mong đợi lỗi/ngoại lệ tôi thấy nó nhận được thực hiện bình thường:

$ ./python_prop_test 
Init 
Re-Init 

My Python phiên bản là 2.7.2. Những gì tôi nhìn thấy, là nó mong đợi? Làm thế nào để chắc chắn rằng một tài sản không được giải quyết?

Trả lời

24

Đối với điều này để làm việc như bạn mong đợi, Test nhu cầu là một lớp học kiểu mới:

class Test(object): 
      ^^^^^^^^ 

này được ám chỉ trong documentation for property():

Return một thuộc tính tài sản cho mới các lớp kiểu (các lớp học lấy từ object).

Khi tôi bật Test vào một lớp học kiểu mới, và cố gắng để thay đổi prop, tôi nhận được một ngoại lệ:

In [28]: t.prop='Re-Init' 

AttributeError: can't set attribute 
+1

Lớp kiểu cũ không ưu tiên cho bộ mô tả dữ liệu 'thuộc tính'; nó cho phép bạn đổ bóng thuộc tính trong instance dict. – eryksun

4

Để sử dụng tính bạn phải sử dụng các lớp học kiểu mới. Để sử dụng các lớp kiểu mới trong Python 2, bạn phải kế thừa từ object. Thay đổi lớp học của bạn def thành class Test(object).

+0

Trong trường hợp của tôi Nó không hoạt động mà không có 'đối tượng' ngay cả đối với Python 3 –

Các vấn đề liên quan