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
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4