导入类并调用方法
我正在用Eclipse来编写Python程序。
在我的项目中,有一个文件叫做main.py。这个文件位于项目文件的根目录下。在根目录里,我创建了一个名为Classes的文件夹,里面有一个类文件,叫做PositionWindow.py。这个文件里定义了一个类,叫做PositionWindow,里面还有一个函数,叫做Center()。
在main.py中,我想导入这个类[PositionWindow],然后在合适的地方调用这个Center函数。
但是我在main.py中无法正确导入这个类,也不知道怎么在后面调用这个函数。
3 个回答
你有这样的文件结构:
- /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()
你似乎还在用Java编程。我知道你用Java很久了,但这已经不是Java了。这是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/README
和Twisted/setup.py
来解释和安装你的软件。不要做的:
- 不要把源代码放在叫
src
或lib
的目录里。这会让运行变得困难。- 不要把测试放在Python包外面。这会让测试无法针对已安装的版本运行。
- 不要创建一个只有
__init__.py
的包,然后把所有代码放在__init__.py
里。直接做一个模块就行,简单多了。- 不要试图想出一些神奇的黑科技,让Python能够在用户不需要把包含它的目录添加到导入路径(无论是通过
PYTHONPATH
还是其他方式)的情况下导入你的模块或包。你无法正确处理所有情况,用户会因为你的软件在他们的环境中无法工作而生气。
与其在项目的根目录下创建一个“文件夹”,不如创建一个“包”。只需创建一个空文件,命名为 __init__.py
,这样你就可以在 main.py 中导入你的模块了。
import Classes.PositionWindow
p = Classes.PositionWindow.PositionWindow()
p.Center()
不过,你应该了解一下模块和包的知识,因为你的结构可能有问题。首先,类不一定要像在Java中那样放在单独的 .py 文件里。此外,你的包、模块、函数和方法的名字都应该用小写字母,只有类名需要用大写字母。