Implementing Properties
Credit: Luther Blissett
Problem
You want client code to use normal attribute-access syntax for using, binding, or deleting instance attributes, but you want the semantics of these actions to be determined by method calls (e.g., to compute an attribute’s value on the fly).
Solution
With Python 2.2 new-style classes, the new built-in
property
function lets you do this directly:
class Rectangle(object):
def _ _init_ _(self, width, height):
self.width = width
self.height = height
def getArea(self): return self.width * self.height
def setArea(self, value): raise AttributeError, "Can't set 'area' attribute"
area = property(getArea, setArea)With classic classes, you must implement properties yourself with the
special methods _ _getattr_ _ and _ _setattr_ _:
class Rectangle:
def _ _init_ _(self, width, height):
self.width = width
self.height = height
def getArea(self): return self.width * self.height
def setArea(self, value): raise AttributeError, "Can't set 'area' attribute"
def _ _getattr_ _(self, name):
if name=='area': return self.getArea( )
raise AttributeError, name
def _ _setattr_ _(self, name, value):
if name=='area': return self.setArea(value)
self._ _dict_ _[name] = valueDiscussion
Properties are an important object-oriented concept. Instances of a class often need to expose two different kinds of attributes: those that hold data and those that are computed on the fly with a suitable method, whenever their values are required. If you expose the real attributes ...