<boiled down version of George's exmaple>
I'm not sure if it was clear to you, but my problem is the dummy WorldModel_v1.MovableObject class. It doesn't do anything by itself, but it has to be in the inheritance chain to make its descendants work properly.
George,
since you explicit allowed metaprogramming hacks :-), how about something like this (not tested beyond what you see):
class WorldVersion(type):
"""WorldVersion instances are World classes
If a World inherits from another World: Field, Movable, Player
automatically inherit from their corresponding superclasses"""def __new__(self, name, bases, clsdict):
clslist = set(["Field", "Movable", "Player"])
baseworld = bases[0]
if type(baseworld) is self:
for cls in clslist:
base = getattr(baseworld,cls)
target = clsdict.setdefault(cls, base)
if base is target:
continue
oldbases = list(target.__bases__)
if base in target.__bases__:
continue
try:
oldbases[oldbases.index(object)] = base
except ValueError:
oldbases.append(base)
target = type(target.__name__, tuple(oldbases), dict(target.__dict__))
clsdict[cls] = target
return type.__new__(self,name, bases, clsdict)
class World1(object):
__metaclass__ = WorldVersion
class Field(object):
def position(self):
print "Positioning in World1"
class Movable(Field):
def move(self):
print "Moving in World1"
class Player(Movable):
def passBall(self):
print "Passing in World1"class World2(World1):
__metaclass__ = WorldVersion
class Field(object):
def position(self):
print "Positioning in World2"
class Movable(Field): # You still need placeholder classes
# but they are trivial
pass
class Player(Movable):
def passBall(self):
print "Passing in World2"class World3(World2):
__metaclass__ = WorldVersion
class Player(object):
def passBall(self):
print "Passing in World3"
>>> p3 = World3.Player() >>> p3.move() Moving in World1 >>> p3.position() Positioning in World2 >>> p3.passBall() Passing in World2 >>>
Michael
-- http://mail.python.org/mailman/listinfo/python-list
