Is there a way to specify a superclass at runtime?

Chris Colbert sccolbert at gmail.com
Mon Oct 5 15:49:31 CEST 2009


because when i import this module, the classes will already be
determined by the intitial flag setting.

i.e.
SIMULATION = False

class SimController(object):
   def foo(self):
       print 'bar'

class RealController(object):
   def foo(self):
       print 'baz'

if SIMULATION:
   SuperKlass = SimController
else:
   SuperKlass = RealController

class Controller(SuperKlass):
   pass





In [2]: import testcontroller

In [3]: testcontroller.SIMULATION
Out[3]: False

In [4]: c = testcontroller.Controller()

In [5]: c.foo()
baz

In [6]: testcontroller.SIMULATION = True

In [7]: c = testcontroller.Controller()

In [8]: c.foo()
baz

On Mon, Oct 5, 2009 at 3:32 PM, MRAB <python at mrabarnett.plus.com> wrote:
> Chris Colbert wrote:
>>
>> I have an application that needs to run different depending on whether
>> the input data is being simulated, or provided from instrumentation.
>>
>> I am trying to abstract this machinery in a single class called
>> Controller which I want to inherit from either SimController or
>> RealController based on whether a module level flag SIMULATION is set
>> to True or False.
>>
>> so I have something like this:
>>
>>
>> SIMULATION = False
>>
>> class SimController(object):
>>    "do sim stuff here"
>>
>> class RealController(object):
>>    " do real stuff here"
>>
>> class Controller(SuperKlass):
>>    pass
>>
>>
>> so if SIMULATION == False I want to be able to instance a Controller
>> object that inherits from RealController and vice-versa.
>>
>> I thought this might be possible with metaclasses, but I didnt find
>> anything useful in the docs or on google.
>>
>> Thanks for any help!
>>
> Why not just:
>
> SIMULATION = False
>
> class SimController(object):
>    "do sim stuff here"
>
> class RealController(object):
>    " do real stuff here"
>
> if SIMULATION:
>    SuperKlass = SimController
> else:
>    SuperKlass = RealController
>
> class Controller(SuperKlass):
>    pass
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list