深入解析Python中的__builtins__内建对象


Posted in Python onJune 21, 2016

如果你已经学习了包,模块这些知识了。
你会不会有好奇:Python为什么可以直接使用一些内建函数,不用显式的导入它们,比如 str() int() dir() ...?
原因是Python解释器第一次启动的时候 __builtins__ 就已经在命名空间了(Note: 有s)

进Shell看看:

>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, 
'__name__': '__main__', '__doc__': None, '__package__': None}

你可以再次导入 __builtin__(Note: 没有s):

import __builtin__
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, 
'__name__': '__main__', '__doc__': None, '__builtin__': 
<module '__builtin__' (built-in)>, '__package__': None}

这时候多了一个 __builtin__ 对象,你可以判断它们是不是相同的:

>>> __builtin__ is __builtins__
True
>>> type(__builtin__)
<type 'module'>
>>> type(__builtins__)
<type 'module'>

现在我们把它从一个文件导入:

# file1.py
import __builtin__

print "module name __name__ : ", __name__
print "__builtin__ is __builtins__: ", __builtin__ is __builtins__
print "type(__builtin__): ", type(__builtin__)
print "type(__builtins__): ", type(__builtins__)
print "__builtins__ is __builtin__.__dict__", __builtins__ is __builtin__.__dict__


# file2.py
import file1

"""结果:
module name __name__ : file
__builtin__ is __builtins__: False
type(__builtin__): <type 'module'>
type(__builtins__): <type 'dict'>
__builtins__ is __builtin__.__dict__ True
"""

结论:
__builtins__ 是对内建模块  __builtin__ 的引用,并且有如下两个方面差异:

在主模块中,即没有被其他文件导入。__builtins__是对 __builtin__ 本身的引用,两者是相同的。

通过 __builtins__ is __builtin__.__dict__ 猜想:
在非 '__main__' 模块中,也就是模块被导入后,__builtins__ 应该属于 __builtin__.__dict__ 的一部分,是对 __builtin__.__dict__ 的引用,而非builtin本身,它在任何地方都可见,此时builtins的类型是字典。

装饰内建函数
Python 官方文档 解释了如何装饰一个内建函数:

import __builtin__

def open(path):
  f = __builtin__.open(path, 'r')
  return UpperCaser(f)

class UpperCaser:
  __metaclass__ = type

  def __init__(self, f):
    self._f = f

  def read(self):
    return self._f.read().upper()

print open('./a.txt').read()
# 将会全部转为大写输出

Note:Python3.X版本中,内建模块更名为builtins,与Python2.X有所不同

Python 相关文章推荐
python新手经常遇到的17个错误分析
Jul 30 Python
python实现批量改文件名称的方法
May 25 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
教你用一行Python代码实现并行任务(附代码)
Feb 02 Python
pandas分别写入excel的不同sheet方法
Dec 11 Python
对python3标准库httpclient的使用详解
Dec 18 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
Feb 05 Python
详解Python3中的 input() 函数
Mar 18 Python
如何提高python 中for循环的效率
Apr 15 Python
浅谈Python中函数的参数传递
Jun 21 #Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 #Python
常见python正则用法的简单实例
Jun 21 #Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 #Python
简单讲解Python编程中namedtuple类的用法
Jun 21 #Python
Python编程中实现迭代器的一些技巧小结
Jun 21 #Python
Centos Python2 升级到Python3的简单实现
Jun 21 #Python
You might like
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
Python设计模式之原型模式实例详解
2019/01/18 Python
解决Django中多条件查询的问题
2019/07/18 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
css3 transform属性详解
2014/09/30 HTML / CSS
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
技术经理的自我评价范文
2013/12/03 职场文书
领导的自我鉴定
2013/12/28 职场文书
重阳节登山活动方案
2014/02/03 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书
2015财务年终工作总结范文
2015/05/22 职场文书
保外就医申请书范文
2015/08/06 职场文书