假设你有一个python方法,它将类型作为参数; 是否可以确定给定的类型是否是嵌套类?
例如,在这个例子中:
def show_type_info(t): print t.__name__ # print outer class name (if any) ... class SomeClass: pass class OuterClass: class InnerClass: pass show_type_info(SomeClass) show_type_info(OuterClass.InnerClass)
我想要调用以show_type_info(OuterClass.InnerClass)
显示InnerClass是在OuterClass中定义的.
AFAIK,给定一个类而没有其他信息,你无法判断它是否是一个嵌套类.但是,请参阅此处了解如何使用装饰器来确定这一点.
问题是嵌套类只是一个普通类,它是外部类的一个属性.您可能期望工作的其他解决方案可能不会 - inspect.getmro
例如,只提供基类,而不是外部类.
此外,很少需要嵌套类.我会强烈重新考虑在每个特殊情况下这是一个很好的方法,你会觉得很想使用它.
内部类在Python中没有特殊的特性.它只是类对象的属性,与整数或字符串属性没有区别.您的OuterClass/InnerClass示例可以完全重写为:
class OuterClass(): pass class InnerClass(): pass OuterClass.InnerClass= InnerClass
InnerClass无法知道它是否在另一个类中声明,因为它只是一个普通的变量绑定.使绑定方法了解其拥有者"自我"的魔力在这里不适用.
John发布的链接中的内部类装饰魔术是一种有趣的方法,但我不会按原样使用它.它不会缓存为每个外部对象创建的类,因此每次调用outerinstance.InnerClass时都会得到一个新的InnerClass:
>>> o= OuterClass() >>> i= o.InnerClass() >>> isinstance(i, o.InnerClass) False # huh? >>> o.InnerClass is o.InnerClass False # oh, whoops...
此外,它尝试复制使用getattr/setattr在内部类上使外部类变量可用的Java行为的方式非常狡猾,并且实际上是不必要的(因为更多Pythonic方式将显式地调用i .__ outer __.attr).