Play with classes

Jacek Generowicz jacek.generowicz at cern.ch
Thu Feb 26 07:14:52 EST 2004


Zunbeltz Izaola <zunbeltz at wm.lc.ehu.es.XXX> writes:

> I have the following classes defined
> 
> ModeA, ModeB, TypeA, TypeB, TypeC, SubtypeA, SubtypeB.
> 
> Supose the user whant to combine ModeA with TypeB and SubtypeB, so I need
> something like
> 
> class UserClass(ModeA, TypeB, SubtypeB):
>         pass
> 
> I can define all the posibilitys different classes and the using nested
> if/else I can use the correct class, but I want to know if there is a way 
> generate in the fly and in this way there is no necesarity to change code whe
> new Modes or Types are created.

Is the following what you want ?

======================================================
class TypeA: pass
class TypeB: pass
class TypeC: pass
class SubtypeA: pass
class SubtypeB: pass

collect_bases = [(Mode, Type, Subtype)
                 for Mode in [ModeA, ModeB]
                 for Type in [TypeA, TypeB, TypeC]
                 for Subtype in [SubtypeA, SubtypeB]]

count = 0
for bases in collect_bases:
    name = "UserClass%d" % count
    the_class = type(name, bases, {})
    globals()[name] = the_class
    count += 1
======================================================

Now you can try 

>>> UserClass0.__bases__
(<class '__main__.ModeA'>, <class '__main__.TypeA'>, <class
'__main__.SubtypeA'>)

>>> UserClass1.__bases__
(<class '__main__.ModeA'>, <class '__main__.TypeA'>, <class
'__main__.SubtypeB'>)
>>> UserClass2.__bases__
(<class '__main__.ModeA'>, <class '__main__.TypeB'>, <class
'__main__.SubtypeA'>)

And so on, until 

>>> UserClass11.__bases__
(<class '__main__.ModeB'>, <class '__main__.TypeC'>, <class
'__main__.SubtypeB'>)



More information about the Python-list mailing list