2009-08-26 20 views
6

Estoy tratando de crear una clase de punto que defina una propiedad llamada "coordinar". Sin embargo, no se comporta como esperaba y no puedo entender por qué.Objeto 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) 

Parece que p.x y p.y no se establecen por alguna razón, a pesar de que el colocador "debe" fijar esos valores. ¿Alguien sabe por qué es esto?

+0

¿Está utilizando Python 2.6+? –

+0

¿Qué sucede si intenta imprimir 'p.coordinate' justo después de haber instanciado el objeto, antes de intentar cambiarlo? –

+0

Esto es un gotcha old-style-classes-vs-new-style-classes y es de esperar que 'property()' o el IDE lo atrapen. – smci

Respuesta

9

El método property (y por extensión, el @property decorador) requires a new-style class es decir, una clase que subclases object.

Por ejemplo,

class Point: 

debería ser

class Point(object): 

Además, se añadió el atributo setter (junto con los otros) en Python 2.6.

+0

Pero si creo una 'propiedad' dentro de una clase clásica, ¿se produce un error? – Alcott

4

Se trabajará si usted deriva Punto de objeto:

class Point(object): 
    # ...