[Python-Dev] metaclass insanity
Guido van Rossum
guido@python.org
Tue, 05 Nov 2002 12:05:21 -0500
> 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 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.
--Guido van Rossum (home page: http://www.python.org/~guido/)