On 8/4/10, Jerry Hill <malaclyp...@gmail.com> wrote: > On Wed, Aug 4, 2010 at 4:17 PM, Alex Hall <mehg...@gmail.com> wrote: > >> Hi all, >> Further to my questions about overriding builtin methods earlier, how >> would I make a class able to be accessed and changed using index >> notation? For example, take the following: >> deck=CardPile(52) #creates a new deck of cards >> print(len(deck)) #prints 52, thanks to my __len__ function >> for c in deck: print c #also works thanks to __iter__ >> print(deck[4]) #fails with a list index out of range error >> How would I get the last one working? I tried __getattr__(self, i), >> but it did not work. I want to be able to get an arbitrary item from >> the "pile" of cards (which can be a deck, a hand, whatever), and/or >> set an element. A "pile" is just a list of Card objects, so I would >> only need to use sequence indexing, not mapping functions. >> > > Implement __getitem__(self, key) (See > http://docs.python.org/reference/datamodel.html#emulating-container-types ) > > If you want to support slicing (access like deck[0:10]), you'll need to > handle getting a slice object as the key in addition to accepting an integer > key. > > If a pile is really "just" a list of cards, you may want to look into > inheriting from list instead of re-implementing all of the functionality on > your own. I tried this first, by typing class Pile(list): Doing this does not seem to work, though, since creating a pile of size 52 results in a list of size 0, unless I include the __len__ function. I thought putting (list) in my class definition would automatically give me the functions of a list as well as anything I wanted to implement, but that does not seem to be the case.
> > -- > Jerry > -- Have a great day, Alex (msg sent from GMail website) mehg...@gmail.com; http://www.facebook.com/mehgcap _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor