最近Java里的package弄习惯了,回到python里,貌似有点小不习惯,java里只需要import整个package.*,当然写得更详细具体一些更佳,然后就可以调用类创建对象,以及调用方法;而python里一个简单的package,import了,难道还需要通过module来调用类名创建对象?
次日补充:看来昨夜头脑头脑发热,没搞清楚问题所在,简单问题,想歪了~!
MyFile1.py
__author__ = 'LiHui' class MyClass: def __init__(self): print 'MyClass __init__' def fun(self): print 'MyClass fun'
Main.py
__author__ = 'LiHui' from MyPack import MyFile1 class MainClass: def __init__(self): print 'MainClass __init__' def foo(self): print 'MainClass foo' if __name__ == '__main__': mainclass = MainClass() mainclass.foo() myclass = MyClass() myclass.fun()
这里已经import了module MyFile1,感觉应该直接调用MyClass()创建对象,调用构造器就行了,但是实际上,执行报错
Traceback (most recent call last): MainClass __init__ File "E:/pythoncode/MyMain/Main.py", line 14, in <module> myclass = MyClass() NameError: name 'MyClass' is not defined MainClass foo
也就是这行是错误的,需要修改成
myclass = MyFile1.MyClass()
就Ok了
看到这里,我的第一感觉,会不会是目录结构问题,在之前编译JAVA CODE的时候,就存在IDE的执行目录的问题,导致script里import的相对路径存在出入导致问题
目前的结构目录,python脚本文件分别保存在两个package中,显然IDE执行的目录应该就在当前
LiHui@GodLike /cygdrive/e/pythoncode $ ls -l * MyMain: 总用量 2 ----rwx---+ 1 LiHui None 22 五月 6 22:19 __init__.py ----rwx---+ 1 LiHui None 316 五月 6 23:52 Main.py MyPack: 总用量 2 ----rwx---+ 1 LiHui None 20 五月 5 23:25 __init__.py ----rwx---+ 1 LiHui None 146 五月 6 23:27 MyFile1.py
既然如此,将两个python文件copy到同一目录下,用命令行执行测试一次
LiHui@GodLike /cygdrive/e/pythoncode $ ls MyMain MyPack LiHui@GodLike /cygdrive/e/pythoncode $ cp MyMain/Main.py ./ LiHui@GodLike /cygdrive/e/pythoncode $ cp MyPack/MyFile1.py ./ LiHui@GodLike /cygdrive/e/pythoncode $ chmod 777 *.py LiHui@GodLike /cygdrive/e/pythoncode $ ls Main.py MyFile1.py MyMain MyPack LiHui@GodLike /cygdrive/e/pythoncode $ vim Main.py LiHui@GodLike /cygdrive/e/pythoncode $ cat Main.py | grep My import MyFile1 myclass = MyClass() LiHui@GodLike /cygdrive/e/pythoncode $ python Main.py MainClass __init__ MainClass foo Traceback (most recent call last): File "Main.py", line 14, in <module> myclass = MyClass() NameError: name 'MyClass' is not defined LiHui@GodLike /cygdrive/e/pythoncode $ vim Main.py LiHui@GodLike /cygdrive/e/pythoncode $ cat Main.py | grep My import MyFile1 myclass = MyFile1.MyClass() LiHui@GodLike /cygdrive/e/pythoncode $ python Main.py MainClass __init__ MainClass foo MyClass __init__ MyClass fun
这里没有任何其它IDE配置干扰,两个简单的python脚本相同目录下,import了MyFile1之后,创建对象还是要通过MyFile1来调用,可见python里就算import了module,具体调用的时候,依旧还是要带上,但是JAVA里面import还有一个不停深入的from XX.XX.XX import .*,难道python就不能import到目标class类,最终直接调用?不相信python大法会这个小case上行不通,试探性地修改下import的方式,果然就行啦
__author__ = 'LiHui' from MyPack.MyFile1 import MyClass class MainClass: def __init__(self): print 'MainClass __init__' def foo(self): print 'MainClass foo' if __name__ == '__main__': mainclass = MainClass() mainclass.foo() myclass = MyClass() myclass.fun()
感叹下,要多思考,要敢于思考,最重要的,熟练的基础才是一切~!