之前比较懒,有很多好的东西没有写出来,随着时间,也就淡忘了,而这个就当是时间记忆吧。
date:2014.11.07
1. 名称空间是一个从名称到对象的关系映射集合,而对象实际上是存储在内存之中,将名称和内存地址映射后,通过名称可以访问到相应的对象。向名称空间添加一个名称的过程其实是一个将一个标识符绑定对象的过程,同时,对象的引用计数+1,可以通过sys.getrefcount(objname)来查询。
2. 为防止名称冲突的发生,所以每个module都定义了它自己的命名空间,即使属性之间有冲突,但是它们的完整授权名是不同的。另一方面,应该避免导入一个模块的全部属性,更好的做法是只导入需要的类。import module as ... ;from module import attri;from module import *;from module import atrri as ...;
3. 自己写的模块中,可以在后面添加 if __name__ == '__main__': 这样的方式来写一个方法体,可以在本程序中调试,被其他引入时不运行;其原理是每个module中都有个隐形的属性 __name__ ,其在本体运行时,值为‘__main__’
4. 模块的导入需要一个路径搜索的过程,在文件系统的预定义区域中查找导入的module,这些预定义的区域只不过是你的Python搜索路径的集合。路径搜索和搜索路径是两个不同的概念,前者指的是查找某个文件的操作,后者是查找一组目录,默认的搜索路径是在安装时或者编译时进行指定的,可以在启动Python的shell或者在命令行的pythonpath里面。在命令行:import sys ; sys.path将会返回一个列表,这就意味着你可以对这个列表进行修改。sys.path.append('filepath'),当然你可以用insert(i,'filepath'),这样你就可以放到任何位置了。另外使用 sys.modules 方法可以返回一个字典,模块名为键,文件地址为值。
5. Python解释器的加载过程:首先加载内建的名称空间,它有__builtins__模块中的名字构成,可以使用dir(modulename)来查看;随后加载执行模块的全局名称空间,它会在模块开始执行后变成活动名称空间;这就有两个名称空间;如果你在执行期间调用了函数,那么将创建第三个名称空间,局部的名称空间,我们可以通过 globals()和locals()内建函数来判断。__builtins__与__builtin__是不同的两个模块,一般来说前者包含后者
6. 讨论下dir()方法,内建函数dir(classname)时,可以返回它和基类的__dict__内容,dir(objectname)可以显示实例的变量以及实例所在类以及所有基类中定义的方法和属性,dir()不带参数的时候,显示调用着的局部变量;还有一个var()函数接收类参数,显示类的属性。来自 http://kada.cc/61.html
7. 名称空间和变量作用域,名称空间只是指明了名称和对象之间的映射关系,但是变量域还要规定哪些变量是可以由哪些代码执行的。查找一个变量时,解释器先从局部名称空间-全局名称空间-内建名称空间,否则将会有一个NameError。重要的一点就是先查找的名称空间会遮蔽其他后搜索的名称空间。这就可以解释程序中很多变量的问题。
8. import的导入规范:Python的标准模块-Python的第三方模块-应用程序自定义的模块的顺序组织,如果模板是被第一次导入,它将被加载并执行,这一过程也保证了加入的模块是否有错误。比如说你导入了sys模块,你导入的其他模块中同时也导入了sys模块,但是它只加载一次。
9. 从模块导入名字的一个副作用是它会成为局部命名空间的一部分,会覆盖一个已经存在的名称,所以为了避免这种情况最好还是使用其模块导入,另外在当前模块改变导入的变量时不会引起原被导入文件的改变。
10. from __future__ import newfeature 这里的newfeature必须显性的写出来。
11. 模块的内建函数:__import__()函数, import语句调用其完成工作。其参数包含modulename,globals,locals,fromlist,后面三个是可选的,默认分别为globals(),locals()还有[]; import sys 可以用 sys = __import__('sys')来导入。