【问题标题】:Using class/function in another module在另一个模块中使用类/函数
【发布时间】:2015-01-17 03:36:48
【问题描述】:

我主要来自 Java 背景,但最近一直在钻研一些 Python。我大部分时间都在理解它,但是有些语法对我来说似乎很奇怪。我有这个我正在处理的项目,其中包含多个文件/类。我有一个类,Mesh.py:

class Mesh:
    def __init__(self, name):
        #dostuff

我想在另一个文件 Main.py 中实例化。我注意到两件事,

  1. 我必须导入Mesh,这对我来说似乎很奇怪,因为它在我的项目中,
  2. 要创建网格,我必须这样做:

    mesh = Mesh.Mesh('name')
    

这看起来超级尴尬。为什么我不能这样做

mesh = Mesh('name')

我在这里做错了什么,还是这只是 Python 中不可避免的一部分?

【问题讨论】:

  • Java 假设类 Foo 在文件 Foo.java 中。 Python 没有这个要求,因此您需要同时提供文件名和类名。随着您学习更多语言,您应该对不同的约定(如 tis)更加熟悉。随它滚动。
  • 为您的模块和您的班级使用不同的名称可能会澄清这里发生的事情。

标签: python


【解决方案1】:

在 Python 中,您创建的每个文件都是一个模块,模块的集合可以在逻辑上分组为 package。 Python 与 Java 略有不同,后者允许使用同一包中的文件而无需显式导入。

由于模块是一个命名空间,所以无论何时在模块中使用标识符,都必须在其中定义,否则会得到NameError

当你导入一个模块时,

import Mesh

Python 知道您已经导入了一个模块,并且其中的所有项目都可以使用模块的名称来引用。如果你这样做了

网格('名称')

你会得到一个错误,因为当前模块中只导入了Mesh模块,而不是Mesh类。这就是为什么你必须明确指定

Mesh.Mesh('name')

这意味着,你告诉 Python,我指的是我导入的 Mesh 模块中的 Mesh 类。

但在您的情况下,您只能将 Mesh 模块中的特定类导入当前模块的命名空间,如下所示

from Mesh import Mesh

然后创建它的一个对象,像这样

Mesh('name')

【讨论】:

    【解决方案2】:

    好吧,您可以将 Mesh.py 命名为其他更吸引人的名称,与 Java 不同,您的 .py 模块中不需要类名,并且不必只包含一个“顶级类”

    否则你也可以这样做

    from Mesh import Mesh
    Mesh('name')
    

    【讨论】:

      【解决方案3】:

      我有一个类,Mesh.py

      问题就在这里。 Mesh.py 不是一个类,它是一个文件,也就是说它是一个模块。

      在 Python 中,您不应该自动遵循 Java 模式,将每个类放在自己的文件中。如果多个文件变得太大且难以放入一个文件中,请在多个文件之间进行拆分。如果您有许多小类(和/或函数和其他东西),只需将它们放在一个文件中即可。然后你就不必导入任何东西了。如果您需要在多个文件之间拆分内容,您不会认为导入是一个问题,因为此时您的代码库将足够复杂,拆分为多个模块将提高代码清晰度。

      【讨论】:

        【解决方案4】:

        如果你使用模块,你应该知道,例如random模块有一个方法randint。如果你这样做;

        import random
        

        你必须使用像这样的randint方法;

        random.randint()
        

        但如果你只想使用randint方法,你可以这样做;

        from random import randint
        

        那你就可以这样用了;

        randint()
        

        所以你的模块名称是Mesh.py,如果你像这样导入它;

        import Mesh
        

        你必须在Mesh模块中使用你的Mesh方法;

        Mesh.Mesh()
        

        正如您在上面的 random 模块中看到的。所以你必须像这样导入它;

        from Mesh import Mesh
        Mesh()
        

        因为你的模块名称是Mesh,所以如果你把你的模块保存为ChuckNorris那么你必须这样做;

        from ChuckNorris import Mesh
        Mesh()
        

        或;

        import ChuckNorris
        ChuckNorris.Mesh()
        

        记住在 Python 中,每个脚本基本上都是一个模块。您很困惑,因为您的脚本/模块名称是Mesh,并且此脚本/模块有一个名为Mesh 的方法。这就是为什么如果你使用import Mesh,你必须使用它Mesh.Mesh()。试着把你的模块名另存为,你会明白的。

        【讨论】:

          【解决方案5】:

          如果您引用具有定义的模块(即 Mesh.py)内的类,则根本不必导入。在这种情况下,Mesh(类)位于模块级命名空间中。这一点值得注意,因为您可以在一个模块中拥有任意数量的类。

          将 Mesh(类)导入模块级命名空间的另一种方法是从定义它的模块(或任何其他已导入它的模块)中导入它。喜欢:

          from Mesh import Mesh
          mesh = Mesh('name')
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-19
            • 2019-05-02
            • 2018-04-04
            • 2013-07-22
            • 1970-01-01
            • 2016-05-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多