Java的import和Python的import的区别

1、Java的import本质是声明以下出现的标识符前面都加上命名空间(java只能导入类和静态的成员)

2、python的import本质是执行了整个模块的代码(python只能导入模块,from语句例外)

Java在import类的时候,并不执行类代码,也不把类加载进内存,所以说import语句对于java来说只在编译器起作用,运行期就没用了。

python在import模块的时候,是执行了模块的所有代码。这里有两种理解方式都正确:一种是代码执行完后,产生了一个模块对象,以后通过这个模块对象访问所有的模块里定义的成员。另一种是代码执行完后,并没有产生一个模块对象(或者仅仅认为产生了一个非常简单的不带要任何成员的对象),但代码里面定义的所有成员前面自动加上了命名空间。以上两种理解方式都可以帮助理解代码(不同的书讲的不一样)。但是我更倾向于第一张理解方式,因为模块的作用就是为了封装和代码的重用,而包的主要作用才是命名空间。
【其实,Java中的名字空间即包名是虚的,不是一个实体,只起到姓氏的作用;而Python中的名字空间即模块名是实的,是一个真正的实体,就好像是个类一样,只不过是比类更高级的一层封装,它可以封装类、变量、函数等。】

可以认为模块就是封装的更高级一点的函数,其行为和函数很像,在模块中定义的东西可以通过模块名.东西来访问,函数里定义的东西也可以这样访问,而且函数有局部作用域,模块也有局部作用域,例如模块中打印__name__输出的是模块的名字,但在其他模块中输出的是其他模块的名字,这个__name__就是局部变量。

【总之,Java中包直接管理到类,而在Python中包直接管理到模块】

正是由于有上述区别,在执行Java代码中没有相对查找概念,而在Python中有相对查找概念,所谓相对查找是指在运行模块a时,模块a里面导入了模块b,那么怎么找到b呢?相对查找的意思是如果a和b在同一目录下,则直接可以找到b,否则从系统目录和工作目录里面找到b,也就是说b只能放在和a同一目录或者放在系统目录或者放在工作目录。为什么Java没有相对查找概念呢?因为Java中import模块时实际上只是个声明,不涉及文件查找,以后第一次用到类时再根据类的全名从初始路径(系统目录或工作目录)开始查找。

3、Java中导入的是类,而在Python中导入的是模块,不要因为这个不同就迷糊了,其实模块本质就是比类更高级一点的封装而已,你也完全可以把他理解成类(Java的类内部东西自动带上类名作为命名空间,而Python模块内部的东西自动带上模块名作为命名空间)。但两者语言的命名空间名都是指包名。

4、在Java中有packet打包语句,能自动按照多层命名空间名生成多层目录来打包,打包结果就是给每个标识符加上命名空间名(也叫包名),而Python中没有打包语句,需要打包的话,必须手动建立文件夹,文件夹层级对应命名空间名层级。总之,不管哪种语言,多层包名一定对应多层目录名,运行时查找对应的类或模块时是根据多层包名在对应的层级子目录中查找到需要的类或模块的。

转载自:https://blog.csdn.net/WaitForFree/article/details/51254146

You may also like...