Overriding a method at the instance level on a subclass of a builtin type
Aaron Brady
castironpi at gmail.com
Thu Dec 4 23:15:46 EST 2008
On Dec 4, 11:16 am, "Zac Burns" <zac... at gmail.com> wrote:
> The class method seems to be the most promising, however I have more
> 'state' methods to worry about so I might end up building new classes
> on the fly rather than have a class per permutation of states! Now the
> code isn't quite as clear as I thought it was going to be.
>
> It seems unfortunate to me that methods are always looked up on the
> class for new style objects. Was this done for speed reasons?
I thought of two more solutions. One, derive a new class for each
instance as you create it, and assign methods to that, that can be
shared. Even more memory consumption though.
>>> class A:
... def methA( self ): print 'methA'
... def methB( self ): print 'methB'
...
>>> class A1(A): meth= A.methA
...
>>> a1=A1()
>>> a1.meth()
methA
>>> A1.meth=A.methB
>>> a1.meth()
methB
Two, use getter properties to return the right function, based on
index and array.
>>> class A( object ):
... @property
... def meth( self ):
... return self.meths[ self.methA_i ].__get__( self, A )
... def methA( self ):
... print 'methA'
... self.methA_i+= 1
... def methB( self ):
... print 'methB'
... self.methA_i-= 1
... meths= [ methA, methB ]
... def __init__( self ):
... self.methA_i= 0
...
>>> a= A()
>>> a.meth()
methA
>>> a.meth()
methB
>>> a.meth()
methA
Or (two B), look up the method by name on name-index pair.
>>> class A( object ):
... @property
... def meth( self ):
... return getattr( self, self.meths[ self.methA_i ] )
... def methA( self ):
... print 'methA'
... self.methA_i+= 1
... def methB( self ):
... print 'methB'
... self.methA_i-= 1
... meths= [ 'methA', 'methB' ]
... def __init__( self ):
... self.methA_i= 0
...
>>> a= A()
>>> a.meth()
methA
>>> a.meth()
methB
>>> a.meth()
methA
The 'meths' list will need separate lists for each 'group' of state-
dependent functions you wish to use.
More information about the Python-list
mailing list