[Python-Dev] metaclass insanity

Michael Hudson mwh@python.net
30 Oct 2002 13:00:28 +0000


For moderately nefarious reasons[1] I've being trying to write a
metaclass whose instances have writable __bases__. This in itself
isn't so hard, but having assigments to __bases__ "do the right thing"
has eluded me, basically because I can't seem to affect the mro.
Here's what I have so far:
def base_getter(klass):
 return klass.__priv_bases__
def base_setter(klass, v):
 klass.__priv_bases__ = v
class MetaMutableBases(type):
 def __new__(self, name, bases, ns):
 t = type.__new__(self, name, bases, ns)
 t.__priv_bases__ = type.__dict__["__bases__"].__get__(self)
 return t
 __bases__ = property(base_getter,
 base_setter)
 def mro(self):
 if hasattr(self, "__priv_bases__"):
 return type("noname", self.__priv_bases__, {}).__mro__
 else:
 return type.mro(self)
I've tried variations on the same, but haven't got anything working yet.
Anyone have any ideas? I think my brain's exploded.
And I realise this is in some sense more appropriate for c.l.py, but I
think my odds of a good answer are vastly higher here.
Cheers,
M.
[1] in http://groups.google.com/groups?selm=m2r8e99l0b.fsf%40python.net
 I posted a metaclass that attempts to automatically upgrade
 instances of its instances on redefinition. Ideally, this would
 also frob its subclasses so they now inherited from redefined class.
 I'm aware this can go wrong in various ways, but I think it would be
 pretty handy in a large range of situations.
-- 
 This is not to say C++ = bad, Lisp = good. It's to say
 C++ = bad irrespective of everything else.
 -- Alain Picard, comp.lang.lisp

AltStyle によって変換されたページ (->オリジナル) /