Внутренний класс не предлагает особых особенностей в Python. Это только свойство объекта класса, ничем не отличающееся от целочисленного или строкового свойства. Ваш пример OuterClass / InnerClass может быть переписан точно так:
class OuterClass(): pass
class InnerClass(): pass
OuterClass.InnerClass= InnerClass
InnerClass не может знать, было ли оно объявлено внутри другого класса, потому что это просто простая привязка переменной. Магия, благодаря которой связанные методы узнают об их собственном «я», здесь не применима.
Магия внутреннего декоратора в ссылке, которую Джон опубликовал, - интересный подход, но я бы не стал использовать его как есть. Он не кэширует классы, которые он создает для каждого внешнего объекта, поэтому вы получаете новый InnerClass каждый раз, когда вызываете externalinstance.InnerClass:
>>> o= OuterClass()
>>> i= o.InnerClass()
>>> isinstance(i, o.InnerClass)
False # huh?
>>> o.InnerClass is o.InnerClass
False # oh, whoops...
Также способ, которым он пытается воспроизвести поведение Java, делая переменные внешнего класса доступными во внутреннем классе с помощью getattr / setattr, очень хитрый и действительно ненужный (поскольку более Pythonic способ будет вызывать i .__ external __. Attr явно ).