最近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()
感叹下,要多思考,要敢于思考,最重要的,熟练的基础才是一切~!
