On Mon, 22 Aug 2011 15:27:36 +1000 Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> wrote:
> On Mon, 22 Aug 2011 03:04 pm John O'Hagan wrote: > > > The "pitches" attribute represents the instances and as such I found > > myself adding a lot of methods like: > > > > def __getitem__(self, index): > > return self.pitches[index] > > > > def __len__(self): > > return len(self.pitches) > > > Looks like a call for (semi-)automatic delegation! > > Try something like this: > > > # Untested > class MySeq(object): > methods_to_delegate = ('__getitem__', '__len__', ...) > pitches = ... # make sure pitches is defined > def __getattr__(self, name): > if name in self.__class__.methods_to_delegate: > return getattr(self.pitches, name) > return super(MySeq, object).__getattr__(self, name) > # will likely raise AttributeError Thanks, this looks promising. I didn't know about __getattr__ or delegation. This example doesn't seem to work as is for special methods beginning with "__" (e.g.: "TypeError: object of type 'MyList' has no len()"). It seems that __getattr__ is not called for special methods. Also, it doesn't immediately suggest to me a way of modifying method calls (maybe __setattr__?). But it's certainly a neater way to get methods to operate on the attribute. I'm looking into it, and delegation generally. However, I don't understand what the super call is doing. If the method isn't delegated, shouldn't it just fall back to getattr(self, name)? Thanks and regards, John -- http://mail.python.org/mailman/listinfo/python-list