2009-08-26 76 views
6

我正在嘗試創建一個定義名爲「座標」屬性的點類。然而,這並不像我所期望的那樣,我無法弄清楚爲什麼。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) 

似乎p.x和p.y由於某種原因未被設置,即使setter「應該」設置這些值。有人知道這是爲什麼?

+0

你使用Python 2.6+? – 2009-08-26 22:44:26

+0

如果在嘗試更改對象之前嘗試在剛剛實例化對象之後嘗試打印「p.coordinate」,會發生什麼情況? – 2009-08-26 22:47:48

+0

這是一個古老的風格類vs新風格的類,你可能會期望'property()'或IDE會捕獲它。 – smci 2012-08-21 22:47:10

回答

9

property方法(和擴展名,@property裝飾器)requires a new-style class,即一個類object

例如,

class Point: 

應該是

class Point(object): 

另外,在Python 2.6中加入setter屬性(與其他一起)。

+0

但是,如果我在經典類中創建一個'property',會引發錯誤? – Alcott 2012-05-12 08:04:42

4

如果從對象派生一點上,將工作:

class Point(object): 
    # ...