2009-08-26 40 views
6

Tôi đang cố tạo lớp điểm xác định thuộc tính được gọi là "tọa độ". Tuy nhiên, nó không hoạt động như tôi mong đợi và tôi không thể hiểu tại sao.Đối tượng Python @property

class Point: 
    def __init__(self, coord=None): 
     self.x = coord[0] 
     self.y = coord[1] 

    @property 
    def coordinate(self): 
     return (self.x, self.y) 

    @coordinate.setter 
    def coordinate(self, value): 
     self.x = value[0] 
     self.y = value[1] 

p = Point((0,0)) 
p.coordinate = (1,2) 

>>> p.x 
0 
>>> p.y 
0 
>>> p.coordinate 
(1, 2) 

Có vẻ như p.x và p.y không được đặt vì lý do nào đó, mặc dù setter "nên" đặt các giá trị đó. Có ai biết tại sao không?

+0

Bạn đang sử dụng Python 2.6+? –

+0

Điều gì sẽ xảy ra nếu bạn cố gắng in 'p.coordinate' ngay sau khi bạn đã khởi tạo đối tượng, trước khi cố thay đổi nó? –

+0

Đây là một lớp học kiểu cũ với các lớp học kiểu cũ và bạn có thể mong đợi hoặc là 'property()' hoặc IDE sẽ bắt nó. – smci

Trả lời

9

Phương thức property (và bằng cách gia hạn, trang trí @property) requires a new-style class tức là lớp học phân lớp object.

Ví dụ,

class Point: 

nên

class Point(object): 

Ngoài ra, setter thuộc tính (cùng với những người khác) đã được bổ sung bằng Python 2.6.

+0

Nhưng nếu tôi tạo một 'thuộc tính' bên trong một lớp cổ điển, lỗi được nêu ra? – Alcott

4

Nó sẽ có tác dụng nếu bạn lấy được điểm từ đối tượng:

class Point(object): 
    # ... 
Các vấn đề liên quan