关于Python的包、模块、属性的小介绍。模块:python中的模块(module)就是同名的py文件。
属性:module的属性(attribute)可以是函数、类、变量等。
包:python中的包(package)就是同名目录,且需要在该目录下有__init__.py表示该目录是一个package(其内容可以为空)。
package的拓扑结构相当于目录的结构,即对应于package1.package2(package2是package1的子package),目录package1有子目录package2。而在__init__.py中可以import其他的package/module/attribute,从用户角度来看,这类似于文件系统中的link或快捷方式。
package也是module,其内容是package对应目录中的__init__.py文件(你可以通过打印module.__file__来确认这点)。如果其中import了下属module的attribute,则相当于该package对应的module也有了这个attribute(就像快捷方式)。
模块文件(xxx.py或者__init__.py)中的__all__属性(是一个list类型的变量)用于显式定义from module import *时暴露出来的接口。如果没有__all__,则:对于module来说,其中所有非下划线开头的成员都会被暴露出来
对于package来说,其所有非下划线开头的成员,和下级模块都会被暴露出来
from package.module import *受__all__的约束,只会导入被__all__暴露出来的attribute和子module,但是在直接from package.module import xxx时,xxx不受__all__约束。
import和from import:from A.B import C:A必须是package,B可以是package/module,C可以是package/module/attribute/*,用时直接用C
import A.B.C:A、B必须是package,C可以是package/module,用时需要写全A.B.C(这个操作实际上相当于import A,导入之后A.D也可以直接使用)
导入package:import package :导入package(作为module),之后可以直接用package
import package1.package2:导入package1.package2进入命名空间,之后可以通过package1.package2使用package2。该操作实际是导入整个package1进入命名空间,也可以通过http://package1.xxx来使用package1的其他成员。
from package1 import package2 :直接导入package2进入命名空间,之后可直接使用package2
导入module:import package.module:导入package.module进入命名空间(其实是导入整个package进入命名空间),之后可以通过package.module使用module
from package import module:直接导入module进入命名空间,之后可直接使用module
导入attribute:from package.module import attribute:导入attribute,之后可以直接用
from package import attribute:同上,因为在package的__init__.py中导入module,因此此处的module可以忽略
导入所有成员:from package1.package2 import *:导入package2下所有的module和attribute,通过package2下__init__.py文件中的__all__变量指定,如果没有则导入所有非下划线开头的成员
from package.module import *:导入module下所有的attribute
错误格式:import package.attribute:错误,import a.b.c中c只能是module/package
import package.module.attribute :错误,只有package之后才能跟“.”
from package import module.attribute:错误,import之后不能有“.”
总结一下就是:可以import package/module
可以from package/module import package/module/attribute
“.”只能在package之后
from xxx import yyy中,import之后不能有“.”