当前位置:  开发笔记 > 编程语言 > 正文

python:确定一个类是否嵌套

如何解决《python:确定一个类是否嵌套》经验,为你挑选了2个好方法。

假设你有一个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中定义的.



1> John Feminel..:

AFAIK,给定一个类而没有其他信息,你无法判断它是否是一个嵌套类.但是,请参阅此处了解如何使用装饰器来确定这一点.

问题是嵌套类只是一个普通类,它是外部类的一个属性.您可能期望工作的其他解决方案可能不会 - inspect.getmro例如,只提供基类,而不是外部类.

此外,很少需要嵌套类.我会强烈重新考虑在每个特殊情况下这是一个很好的方法,你会觉得很想使用它.



2> bobince..:

内部类在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).

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有