[Python-Dev] metaclass insanity (original) (raw)
Kevin Jacobs jacobs@penguin.theopalgroup.com
Wed, 30 Oct 2002 09:15:52 -0500 (EST)
- Previous message: [Python-Dev] metaclass insanity
- Next message: [Python-Dev] metaclass insanity
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 30 Oct 2002, Michael Hudson wrote:
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.
The mro is an internal data structure of new-style classes, so redefining mro() doesn't change the values used. Here is my (non-working version) that attempts to re-assign the class of an object, although it fails on a layout violation with Python 2.2.2.
def base_getter(cls): return cls.my_bases
def base_setter(cls,bases): if not bases: bases = (object,) metaclass = getattr(cls, 'metaclass', type) new_cls = metaclass(cls.name, bases, dict(cls.dict)) cls.class = new_cls
class MetaBase(type): bases = property(base_getter,base_setter)
def new(cls, name, bases, ns): ns['my_bases'] = tuple(bases) return super(MetaBase, cls).new(cls, name, bases, ns)
class Foo(object): metaclass = MetaBase class Baz(object): pass
Foo.bases = Foo.bases + (Baz,)
Which results in: TypeError: class assignment: 'Foo' object layout differs from 'MetaBase'
I haven't looked into why this is being flagged as a layout error, though my first instinct is to say that the check is too conservative in this case. I'll think about it more and dig into the code.
-Kevin
-- Kevin Jacobs The OPAL Group - Enterprise Systems Architect Voice: (216) 986-0710 x 19 E-mail: jacobs@theopalgroup.com Fax: (216) 986-0714 WWW: http://www.theopalgroup.com
- Previous message: [Python-Dev] metaclass insanity
- Next message: [Python-Dev] metaclass insanity
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]