【问题标题】:python import nested classes shorthandpython导入嵌套类速记
【发布时间】:2014-05-18 02:33:22
【问题描述】:

如何使用“as”简写导入嵌套包?

这个问题类似于importing a module in nested packages,只是嵌套在同一个 .py 文件中,而不是跨文件夹。

在 foo.py 中(所有 python 文件都在同一个包中,并且是 3.4 版本):

class Foo:
    class Bar:
        ...

我可以在另一个 .py 文件中访问这些子类:

from . import foo
...
bar = foo.Foo.Bar()

我想做的事:

from . import foo.Foo.Bar as Bar  # DOES NOT WORK: "unresolved reference" error.
...
bar = Bar()  # saves typing.
bar2 = Bar()
...

有没有办法做到这一点?

【问题讨论】:

  • 你为什么在这里使用嵌套类?在 Python 中使用它们并没有什么好的理由。
  • 您可以在 foo.py 文件的末尾添加 Bar = Foo.Bar 行,然后可以从模块中 import Bar

标签: python class import


【解决方案1】:

嵌套 Python 类没有什么意义;除了嵌套命名空间之外,这样做没有任何特殊含义。 很少需要这样做。如果您需要生成额外的命名空间,只需使用模块即可。

您不能直接导入嵌套类;您只能导入模块全局变量,因此在这种情况下为 Foo。您必须导入最外层的类并创建一个新引用:

from .foo import Foo
Bar = Foo.Bar
del Foo  # remove the imported Foo class again from this module globals

del Foo 完全是可选的。上面确实说明了为什么您一开始就不想嵌套类。

【讨论】:

  • 有趣的地方。我有时将自定义异常作为抛出它们的类(唯一的类)的类成员。这也是气馁吗?
  • @Hyperboreus:不是真的; Django 在生成的模型上使用它。在这种情况下,每个模型的异常是您可以直接导入的更通用异常的子类。
  • @Hyperboreus:然而,大多数使用嵌套类的初级开发人员并不真正知道他们在做什么。基于这些理由,我大多不鼓励使用。
  • 拥有内部类有一点:上下文化代码。例如,属于某个接口的错误。您正在按结构记录代码。
  • “嵌套 python 类没有什么意义”。实现自定义命名空间的一百万种语言不同意您的看法。您组织代码的解决方案是什么?您说大多数使用嵌套类的初级开发人员并不真正知道他们在做什么。他们在做什么?我没有看到你在这里提出的观点。 OP 希望以嵌套的方式组织他们的代码,他们有这种方式,并且希望使用单线导入它或具有类似的优雅实现。提供解决方案,还是支持您的主张并提供替代方案?
猜你喜欢
  • 2016-07-30
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
相关资源
最近更新 更多