Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python object @property

I'm trying to create a point class which defines a property called "coordinate". However, it's not behaving like I'd expect and I can't figure out why.

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)

It seems that p.x and p.y are not getting set for some reason, even though the setter "should" set those values. Anybody know why this is?

like image 714
cdwilson Avatar asked Aug 26 '09 22:08

cdwilson


2 Answers

The property method (and by extension, the @property decorator) requires a new-style class i.e. a class that subclasses object.

For instance,

class Point:

should be

class Point(object):

Also, the setter attribute (along with the others) was added in Python 2.6.

like image 66
Andrew Keeton Avatar answered Oct 18 '22 21:10

Andrew Keeton


It will work if you derive Point from object:

class Point(object):
    # ...
like image 38
Ned Batchelder Avatar answered Oct 18 '22 21:10

Ned Batchelder