2009-08-26 29 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): 
    # ... 
相关问题