2009-08-26 5 views
6

Sto provando a creare una classe di punti che definisce una proprietà chiamata "coordinate". Tuttavia, non si comporta come mi aspetterei e non riesco a capire perché.Python object @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) 

Sembra che p.x e p.y non sono sempre impostati per qualche motivo, anche se il setter "dovrebbe" impostare questi valori. Qualcuno sa perché questo è?

+0

Si sta utilizzando Python 2.6+? –

+0

Cosa succede se provate a stampare 'p.coordinate' subito dopo aver istanziato l'oggetto, prima di provare a cambiarlo? –

+0

Questo è un gotcha old-style-classes-vs-new-style-classes e potreste aspettarvi sia 'property()' che l'IDE lo catturerebbe. – smci

risposta

9

Procedimento property (e, per estensione, la @property decoratore) requires a new-style class cioè una classe che le sottoclassi object.

Ad esempio,

class Point: 

dovrebbe essere

class Point(object): 

Inoltre, l'attributo setter (insieme alle altre) è stato aggiunto in Python 2.6.

+0

Ma se creo una 'proprietà' all'interno di una classe classica, si verifica un errore? – Alcott

4

Funzionerà se si deriva da Point oggetto:

class Point(object): 
    # ...