[Python-Dev] metaclass insanity

Walter Dörwald walter@livinglogic.de
Wed, 06 Nov 2002 11:56:57 +0100


Guido van Rossum wrote:

>>Even better would to have "X.Y.__outerclass__ is X",
>>i.e. __outerclass__ as a (weak) reference to the class
>>in which X.Y was defined. What I came up with is this:
>>
>>class nestedtype(type):
>>    def __new__(cls, name, bases, dict):
>>       dict["__outerclass__"] = None
>>       res = type.__new__(cls, name, bases, dict)
>>       for (key, value) in dict.items():
>>          if isinstance(value, type):
>>             value.__outerclass__ = res
>>       return res
>>
>>    def __fullname__(cls):
>>       name = cls.__name__
>>       while 1:
>>          cls = cls.__outerclass__
>>          if cls is None:
>>             return name
>>          name = cls.__name__ + "." + name
>>
>>    def __repr__(cls):
>>       return "<class %s/%s at 0x%x>" % \
>>          (cls.__module__, cls.__fullname__(), id(cls))
> 
> 
> I kind of like __fullname__ as a useful attribute (though I'd make it
> an attribute or property [== computed attribute] rather than a
> method).  But if setting the __name__ of an inner class to
> "Outer.Inner" doesn't break too much existing code, I'd prefer that --
> no new attributes needed.

I guess this shouldn't be a problem.

> I don't see any use for __outerclass__ *except* for computing the full
> name.  And there are better ways to do that if you have help from the
> parser.

Exactly, I only used __outerclass__, because I didn't have the help
of the parser and couldn't think of any other way to implement it.

What I wonder is how this will work with classes that are defined
outside but assigned inside an outer class, i.e.:

class NotInner:
    pass

class Outer:
    Inner = NotInner

Will this set NotInner.__name__ to "Outer.NotInner" or not?

Bye,
    Walter Dörwald