为什么打印内部类打印好像它是模块的变量?

时间:2016-12-13 23:06:56

标签: python python-2.7

当我在Python中打印内部类时,为什么它被打印成好像是模块变量(__main__.FInner)而不是打印为__main__.F.FInner或嵌套的东西?

class F(object):

    class FInner:
        x = 1


x = F()
print x.FInner  # __main__.FInner

或者即使我使用较新的样式内部类样式,输出仍然类似

class F(object):

    class FInner(object):
        x = 1


x = F()
print x.FInner  #  <class '__main__.FInner'>

1 个答案:

答案 0 :(得分:3)

这是因为Python中的类(或object可能?)的__repr__()方法默认只显示module.ClassName。因此,类Foo将显示为module.Foo,无论其如何嵌套在其他类中,因为它仍在module中。

如果您直接执行脚本,module将是__main__,但如果您在另一个模块中导入您的课程,它将显示为my_module.ClassName - 而不管如何嵌套它是。

__repr__()(上面链接)的文档说明了此方法返回的字符串:

  

重要的是表示是信息丰富且明确的

在以下情况中:

>>> class Foo(object):
...     class Bar(object):
...             class Baz(object):
...                     pass
... 
>>> Foo.Bar.Baz
<class '__main__.Baz'>

<class '__main__.Baz'>当然不是非常“信息丰富”,也不是明确的,因为名为Baz的顶级类将具有完全相同的__repr__()字符串。但是,根据我的经验,Python中的嵌套类非常少见。即使在嵌套类的情况下,任何重要信息都可能来自类的属性或它继承的类,而不是它碰巧占据的命名空间。我当然可以理解你的好奇心。