python - 为什么打印内部类打印出来就好像它是一个模块的变量?

标签 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'>

最佳答案

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

如果直接执行脚本,module将是 __main__ , 但如果你在另一个模块中导入你的类,它将显示为 my_module.ClassName相反 - 同样,不管它是如何嵌套的。

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

it is important that the representation is information-rich and unambiguous

在类似下面的情况下:

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

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

关于python - 为什么打印内部类打印出来就好像它是一个模块的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41132113/

相关文章:

python - 如何在 Odoo/OpenERP 笔记本中动态添加页面?

Python TimedRotatingFileHandler - 日志文件名中的 PID - 最佳方法

python-2.7 - 阶跃直方图中的列顺序颠倒

python - 在模块中以字符串形式访问变量

python - 为什么两个空字符串切片不充当 'equal' ?

python - 在通过 for 循环创建内容时检查 csv 文件

python - Opencv:TypeError:轮廓不是numpy数组,也不是标量

python - 在我的脚本中获取 "TypeError: an integer is required"

python - 添加返回类别的链接时出现 NoReverseMatch 错误

python - 如何为 Python 安装 yaml 包?