How to modify a program while it's running?
Aaron Brady
castironpi at gmail.com
Tue Dec 16 20:36:22 EST 2008
On Dec 16, 7:26 pm, Steven D'Aprano <st... at REMOVE-THIS-
cybersource.com.au> wrote:
> On Tue, 16 Dec 2008 13:25:17 -0700, Joe Strout wrote:
> > So I'd like to restructure my app so that it can stay running and stay
> > logged in, yet I can still update and reload at least most of the code.
> > But I'm not sure what's the best way to do this. Should I move the
> > reloadable code into its own module, and then when I give my bot a
> > "reload" command, have it call reload on that module? Will that work,
> > and is there a better way?
>
> That should work for functions, but less successfully with classes. The
> problem is that existing objects will still have the old behaviour even
> after reloading the class.
Good catch, Mr. Steven. You could re-query on every call to a method
with __getattr__.
def __getattr__( I, name ):
cls= module.class_to_query
return cls.__getattr__( I, name ) #need to call __get__ on this
That way, when 'class_to_query' changes, the behavior changes.
Here's the implementation:
>>> class Behavior( object ):
... def methA( I ):
... print 'methA one'
...
>>> class Dynamic( object ):
... def __getattr__( I, key ):
... return getattr( Behavior, key ).__get__( I, Behavior )
...
>>> x= Dynamic( )
>>> x.methA( )
methA one
>>> class Behavior( object ):
... def methA( I ):
... print 'methA two'
...
>>> x.methA( )
methA two
You would have to soft-code 'Behavior' into the initializer of
'Dynamic' as a string, not the class object.
More information about the Python-list
mailing list