python的package问题

最近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()

感叹下,要多思考,要敢于思考,最重要的,熟练的基础才是一切~!

发表回复