模块 模块,在Python可理解为对应于一个文件。在创建了一个脚本文件后,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可重用这些函数和变量。...这就是在导入下面这些标准模块,一切美好事情能发生的原因。 这些搜索目录可在运行时动态改变,比如将module1.py不放在当前目录,而放在一个冷僻的角落里。...这里你就需要通过某种途径,如sys.path,来告知Python了。sys.path返回的是模块搜索列表,通过前后的输出对比和代码,应能理悟到如何增加新路径的方法了吧。...模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。...如果没有定义__all__, 这条语句不会导入所有的package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。
PART 01 前言 Python作为一个解释器,一个程序,如果不导入任何外部模块或包,就做不了什么。理解Python如何导入模块和包将在几乎所有的场景中都很有帮助。...您可能会看到下面列出的许多导入样式,但是哪一种是最好的,哪一种应该避免?...使用__all__。这是一个例子。在你的模块中。...PART 01 检查导入的模块 当你导入一个模块时,你如何知道这个模块的内部?当然,您可以查看文档,但如果您很懒,不想启动无聊的文档怎么办?Python提供了一种方便的方式来实现这一点。...all__变量中,你只允许pub func被调用。
代码重用 系统命名空间的划分 实现共享服务和数据 import如何工作 在阅读本文之前,想必你一定编写过这样的代码: import math print math.sqrt(4) 我们首先导入了math...math模块对象所有的属性 写过c语言程序的人都喜欢把python中的import比作c中的#include,其实这是不太正确的,因为import不只是把一个文件插入到另一个文件,导入时运行时的运算,程序第一次导入指定文件是...语句之类的就要注意它们是否影响你的程序了,而关于模块的搜索路径也需要提一下,如果你不知道可能会出一些小bug。...reload函数主要是让我们的程序变得更加动态: 只会在第一次导入时,加载和执行该模块代码 之后得导入只会使用已加载得模块对象 reload函数会强制已加载得模块得代码重新载入并重新执行。...__all__可以确定哪些模块再from *时会被导入,其实还有一种方法,可以避免哪些模块或变量被导入,那就是将他们命名为单下划线开头的名称。
] 引入自定义模块 第一种,直接 import 这里有个大前提,就是你的py执行文件和模块同属于同个目录(父级目录) 第二种,通过sys模块导入自定义模块的path 如果执行文件和模块不在同一目录...第三种: venv文件下–》lib–》site-packages–》新建文件夹–》存入模块 导入方式: import 文件夹.模块 文件夹.模块.属性(方法) 第四种 动态导入: import sys...包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。...包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包有效避免模块名称冲突问题,让应用组织结构更加清晰 init.py...控制着包的导入行为 init.py为空仅仅是把这个包导入,不会导入包中的模块 all__在__init.py文件中,定义一个__all__变量,它控制着 from 包名 import *时导入的模块
通常情况下,将字符转换为小写或大写就够了,有时你可以使用正则表达式模块「Regex」完成这项工作。...但需要注意的是,该操作要使用切片之前的所有生成器项,以及「islice」对象中的所有项。 跳过可迭代对象的开头 有时你要处理一些以不需要的行(如注释)开头的文件。...创建支持「with」语句的对象 举例而言,我们都知道如何使用「with」语句打开文件或获取锁,但是我们可以实现自己上下文表达式吗?...同样,我们可以让「__all__」为空,这样就不会导出任何东西,当从这个模块导入的时候,会造成「AttributeError」。...有更简单的方法可以做到这一点吗?
例如,通过定义__dir__方法,你可以要求dir(模块)只显示__all__中定义的内容了。 但对于我来说,我更关心__getattr__方法,以及我如何能利用这个特性实现懒加载。...只有当懒加载带来的好处很有用时你才应该使用它,比如,一个运行时间很短的终端程序。对于大多数人,懒加载都是没有必要的,甚至是有害的,它会让你延后得知导入失败,而不是项目一启动时就能够知道。...最古老的方式是在局部加载,而不是全局加载(例如在你定义的函数内进行导入,而不是在模块顶部进行导入)。这种方式确实推迟了加载的时间点,在你的函数被运行时,函数里的import语句才会进行真正的加载。...事实上,Mercurial为了避免这个问题,专门维护了一个模块黑名单,黑名单上的模块不进行延迟加载。但为此,他们不得不一直维护这个名单,所以这样做也不是一个很好的办法。...这样做确实也有“发现导入错误被推迟”这个弊病,但是由于你的导入还是全局的,所以代码更容易控制。 这个代码本身并不复杂。 ? 你可以这样使用上面的代码 ?
而如果__init__.py中定义了__all__,则import *的时候只会导入__all__部分定义的内容。...在 有些 导入import * 的场景中,下一个使用你代码的人(或者你本人)会明白这个名称仅内部使用。...如果你这么写from import *,任何以单下划线开头的名称都不会被导入,除非模块/包的__all__列表明确包含了这些名称。...5、这些命名有什么不同吗?...,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入。
如果当我们要使用的功能在模块中时,我们就可以导入模块,使用模块中的相应功能。也就是说:模块可以帮助你将代码组织得更有逻辑,并允许你将代码划分为更小的、更可管理的部分。...sl al(10) # 通过别名al来使用sleep功能 三,自定义模块 1,如何自定义模块 自定义模块其实就是创建一个以.py结尾的python文件,然后我们可以在这个文件里面写功能 (注意:自定义模块的命名要符合标识符的命名规则...(注意:这种方法可以快速地导入模块中的所有内容,但可能导致命名冲突,因此通常不推荐使用) __all__: __all__ 是模块中的一个特殊变量,它定义了模块中应该被导入的内容。...(换句话说,__all__ 限制了 * 导入的行为) 示例: 这时候我们使用my_print3就会报错,因为__all__变量限制了*的导入 4,模块中的测试代码 假如我们在文件里面写好功能以后...在Python中,一个模块的__name__属性会自动设置为’__main__',如果你直接运行一个模块,你可以通过这个属性来判断当前的模块是否是__main__模块。
标准模块:python自带了200多个使用的模块、成为标准连接库 import如何工作 执行三个步骤 1)、找到模块文件 2)、编译成位码(需要时) 3)、执行模块的代码来创建其所定义的对象。...文件生成命名空间 *模块语句会在首次导入时执行。 *顶层的赋值语句会创建模块属性(文件顶层不在的def和class之内的,但def和class隐性创建的变量名也属于模块属性)。...__all__列表是指出当包(目录—)名称使用from *的时候,应该导入的子模块名称清单。...下划线和__all__不是私有声明,还可以通过其他导入形式修改这类变量名。...这样的话,你的函数在使用的代码运行时,可以保证他们都已定义并赋值过了。 2)通过变量名字符串导入模块的方法 import或from语句内的模块名是”硬编码“的变量名。
从查找顺序上看出,当前目录是第一优先查找,所以尽量不要使用标准库中已存在的名字,避免Python使用该文件取代标准库的模块。...模块编译 ---- Python执行程序实际上有一个些许你机制,当运行Pyhton模块文件时,Python会将后缀名为.py的模块文件编译成后缀名.pyc文件,实际解释执行编译之后的.pyc文件,类似Java...除了编译成.pyc字节码文件外,向Python解释器传递两个-O参数(-OO)会生成优化的字节码.pyo文件。pyo文件比pyc文件装载速度更快,可以提高Python脚本启动速度。...from mypackage import *理想情况下会找出包的所有子模块并导入,但实际情况并非如此。Python会在初始化文件里按照一个名为__all__的列表,导入该列表给出的模块名。...比如定义__all__列表: __all__可以看作是包的索引,在编写Python时,建议在__init__.py文件明确定义_-all__列表。
当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。 使用模块还可以避免函数名和变量名冲突。...,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句...,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。...:注意一定要在于glance同级的文件中测试 from glance.api import versions 注意:可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用...__不能解决吗,__all__是用于控制from...import *
要导入模块,请使用不带.py扩展名的文件名 有趣的是,__name__被设置为文件名,无论你如何导入它 - 例如import pizza as broccoli,__name__仍然是pizza。...pizza >>> menu.MENU [, , ] 包初始化 还记得我们如何把一个__init__.py文件放在一个目录中,这个目录就神奇地变成了一个包吗?...__all__变量。...这里有几个StackOverflow问题: 好的解决方案是把测试或例子放在包里,然后使用相对的导入来避免这个问题。 差点的解决方案是在运行时修改sys.path,增加所需包的父目录(耶,动态!)。...最后,Python中的所有东西都非常简单,即使它不能完整地满足你的需求,你总可以在运行时随时修改任何内容。 目前想写的就这些,谢谢你的关注。 接下来如何,下次分解!
这意味着你可以使用 __init__.py 文件来设置包所需的任何配置或状态。例如,你可以定义包级变量或导入包依赖的其他模块。 最后,__init__.py 文件用于控制从包中导出的符号。...当你从包中导入模块时,Python 首先在模块中查找符号,然后在包的 __init__.py 文件中查找。这允许你选择性地从包中导入符号,而不会弄乱命名空间。...首先,它们允许你将代码组织成称为包的逻辑单元。这使得管理和重用代码变得更容易,并且还有助于避免命名冲突。 其次,__init__.py 文件是控制包的导入行为所必需的。...通过选择性地从包中导入符号,你可以避免名称冲突并保持代码井然有序。 最后,__init__.py 文件通常用于设置包级配置和状态。这可以包括定义包级变量或导入包依赖的其他模块。...我们使用星号表示法(from .mymodule2 import *)将 mymodule2 模块导入包命名空间,然后将 __all__ 设置为应导出的符号列表(__all__ = ['mymodule2
,其他文件调用这个文件时是不显示的 ret = add(12, 22) print('测试:12+22=%d' % ret) 模块中的__all__ 如果一个文件中有__all__变量...,那么也就意味着这个变量中没有的元素,不会被from xxx import *时导入 1,没有__all__。...包有效避免模块名称冲突问题,让应用组织结构更加清晰。 关于__init__.py文件 那么__init__.py文件有什么用?...其实__init__.py 控制着包的导入行为当__init__.py为空:仅仅是把这个包导入,不会导入包中的模块。...在__init__.py文件中,定义一个__all__变量,它控制着 from 包名 import *时导入的模块,可以在__init__.py文件中编写语句,当导入这个包时,这些语句就会被执行。
导入模块 import module_name from package_name import module_name from package_name import * 那么如何import 时,...python 解释器如何才能找到该模块放置的文件位置呢?...,会在与模块文件同一目录下生成.pyc文件。...包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。...all__属性可避免在相互引用时的命名冲突 __path__变量 __path__指定了包的搜索路径 __new__ __new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用
领取专属 10元无门槛券
手把手带您无忧上云