"indexed properties"...

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Thu May 15 05:48:25 EDT 2008


En Wed, 14 May 2008 18:15:41 -0300, David C. Ullrich  
<dullrich at sprynet.com> escribió:

> Having a hard time phrasing this in the form
> of a question...
>
> The other day I saw a thread where someone asked
> about overrideable properties and nobody offered
> the advice that properties are Bad. So maybe we've
> got over that. I suppose properties could have
> Bad consequences if a user doesn't know they exist
> and think that a certain property of an object is
> just an ordinary attribute. But that applies to
> almost any aspect of any language.
>
> If a person comes from, say, Object Pascal (Delphi)
> then properties are hard to live without. The
> other day I decided I wanted what OP calls an
> "indexed property" or "array property". Couldn't
> figure out how to make a _property_ behave that way.
> So I read a little bit about descriptors, and a
> few minutes later I had an indexedproperty thing
> that works just like property, except it gives
> an indexed property! This is just too cool.
>
> Why? For example, a Matrix should have a row[n]
> property allowing things like
>
> m.row[0] = m.row[1] + m.row[2]
>
> Ok, you could do _that_ by just making row
> an ordinary list of Row objects. But then
> you'd have to say
>
> m.row[0] = Row([1,2,3])
>
> where I want to be able to say
>
> m.row[0] = [1,2,3]
>
> and have the Row created automatically.
>
> _Also_ with these indexed properties my Matrix
> can have m.row[j] and m.col[k] that look exactly
> the same to a client - we don't want to store a
> list of rows internally and also store the same
> data in a list of columns. Too cool.
>
> Hmm, none of that's a valid excuse for a post here.
> Um, right, here we go: Anyone see problems or
> possible improvements with the implementation
> of indexedproperty below?
>
> """indexed.py: "indexedproperty" works more or less
> like "property" except it gives what in Object Pascal
> would be an "indexed property". See the
> __name__="__main__" section below for a demo
>
> """
>
> class WriteOnlyIP(Exception):
>   def __str__(self):
>     return """
>
> indexed property is write-only
>
> """
>
> class ReadOnlyIP(Exception):
>   def __str__(self):
>     return """
>
> indexed property is read-only
>
> """
>
> class indexedproperty(object):
>   def __init__(self, getitem=None, setitem=None):
>     self.getitem = getitem
>     self.setitem = setitem
>
>   def __get__(self, obj, owner):
>     self.obj = obj
>     return self
>
>   def __getitem__(self, index):
>     if self.getitem:
>       return self.getitem(self.obj, index)
>     else:
>       raise WriteOnlyIP
>
>   def __setitem__(self, index, value):
>     if self.setitem:
>       self.setitem(self.obj, index, value)
>     else:
>       raise ReadOnlyIP
>
>
> if __name__ == "__main__":
>
>   class AClass(object):
>     def __init__(self):
>       self.cells = [[0,0], [0,0]]
>
>     def SetCell(self, (row, col), value):
>       self.cells[row][col] = value
>
>     def GetCell(self, (row, col)):
>       return self.cells[row][col]
>
>     cell = indexedproperty(GetCell, SetCell)
>
>   C = AClass()
>   for row in range(2):
>     for col in range(2):
>       C.cell[row, col] = "row: %s, col: %s" % (row, col)
>
>   for row in range(2):
>     for col in range(2):
>       print C.cell[row, col]
>
>   C.cell[0,0], C.cell[1,1] = C.cell[1,1], C.cell[0,0]
>
>   print "After  C.cell[0,0], C.cell[1,1] = C.cell[1,1], C.cell[0,0]:"
>
>   for row in range(2):
>     for col in range(2):
>       print C.cell[row, col]
>



-- 
Gabriel Genellina




More information about the Python-list mailing list