导入类并调用方法

0 投票
3 回答
10149 浏览
提问于 2025-04-16 09:44

我正在用Eclipse来编写Python程序。

在我的项目中,有一个文件叫做main.py。这个文件位于项目文件的根目录下。在根目录里,我创建了一个名为Classes的文件夹,里面有一个类文件,叫做PositionWindow.py。这个文件里定义了一个类,叫做PositionWindow,里面还有一个函数,叫做Center()。

在main.py中,我想导入这个类[PositionWindow],然后在合适的地方调用这个Center函数。

但是我在main.py中无法正确导入这个类,也不知道怎么在后面调用这个函数。

3 个回答

1

你有这样的文件结构:

  • /main.py
  • /Classes/PositionWindow.py(里面有一个叫Center的东西)

你有两个选择:

  • 把“Classes”文件夹添加到你的Python路径,这样你就可以直接导入PositionWindow.py。
  • 把“Classes”变成一个包(可以起个更好的名字)。

要把Classes文件夹添加到你的Python路径,你需要把PYTHONPATH设置为一个环境变量,里面包含这个文件夹。这就像你电脑里的PATH一样——当你导入PositionWindow时,Python会在你的路径中查找这个文件。

另外,如果你在Classes文件夹里添加一个空文件:

Classes/__init__.py

那么在main.py中,你可以这样导入这个包和它的内容:

import Classes.PositionWindow
x = Classes.PositionWindow.Center()
5

你似乎还在用Java编程。我知道你用Java很久了,但这已经不是Java了。这是Python...

  • Python没有目录的概念。它有
  • Python没有类文件。它有模块
  • 一个模块里可以有多个类。
  • 一个包里可以有多个模块。

我建议你至少看看Python基础教程(特别是关于包和模块的部分),这样你可以学习Python,而不是试图猜测这个语言。

关于你项目的结构,这里有一篇不错的文章,可以教你怎么做。

不怕抄袭:

Python项目的文件系统结构

作者:Jp Calderone

要做的:

  • 给你的目录起个和项目相关的名字。例如,如果你的项目叫“Twisted”,那么顶层目录可以叫Twisted。发布版本时,最好加上版本号后缀:Twisted-2.5
  • 创建一个Twisted/bin目录,把可执行文件放在里面。如果有的话,不要给它们加.py扩展名,即使它们是Python源文件。里面不要放其他代码,只需导入并调用在项目其他地方定义的主函数。
  • 如果你的项目可以用一个Python源文件表达,那就把它放到这个目录里,并给它起个和项目相关的名字。例如,Twisted/twisted.py。如果需要多个源文件,就创建一个包(Twisted/twisted/,并在里面放一个空的Twisted/twisted/__init__.py),把源文件放进去。例如,Twisted/twisted/internet.py
  • 把单元测试放在包的子包里(注意,这意味着上面提到的单个Python源文件选项是个小把戏——你总是需要至少一个其他文件来放单元测试)。例如,Twisted/twisted/test/。当然,要把它做成一个包,里面有Twisted/twisted/test/__init__.py。把测试放在像Twisted/twisted/test/test_internet.py这样的文件里。
  • 如果你愿意,可以添加Twisted/READMETwisted/setup.py来解释和安装你的软件。

不要做的:

  • 不要把源代码放在叫srclib的目录里。这会让运行变得困难。
  • 不要把测试放在Python包外面。这会让测试无法针对已安装的版本运行。
  • 不要创建一个只有__init__.py的包,然后把所有代码放在__init__.py里。直接做一个模块就行,简单多了。
  • 不要试图想出一些神奇的黑科技,让Python能够在用户不需要把包含它的目录添加到导入路径(无论是通过PYTHONPATH还是其他方式)的情况下导入你的模块或包。你无法正确处理所有情况,用户会因为你的软件在他们的环境中无法工作而生气。
1

与其在项目的根目录下创建一个“文件夹”,不如创建一个“包”。只需创建一个空文件,命名为 __init__.py,这样你就可以在 main.py 中导入你的模块了。

import Classes.PositionWindow

p = Classes.PositionWindow.PositionWindow()

p.Center()

不过,你应该了解一下模块和包的知识,因为你的结构可能有问题。首先,类不一定要像在Java中那样放在单独的 .py 文件里。此外,你的包、模块、函数和方法的名字都应该用小写字母,只有类名需要用大写字母。

撰写回答