深入解析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文件比较示例分享
Jan 10 Python
进一步理解Python中的函数编程
Apr 13 Python
python类装饰器用法实例
Jun 04 Python
Python ftp上传文件
Feb 13 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
pycham查看程序执行的时间方法
Nov 29 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
Jul 04 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
python正则表达式匹配IP代码实例
Dec 28 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 Python
在django中form的label和verbose name的区别说明
May 20 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
用libtemplate实现静态网页生成
2006/10/09 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
js的对象与函数详解
2019/01/21 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
浅谈Express.js解析Post数据类型的正确姿势
2019/05/30 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
Python实现把xml或xsl转换为html格式
2015/04/08 Python
对numpy中轴与维度的理解
2018/04/18 Python
使用pip安装python库的多种方式
2019/07/31 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
Django 实现图片上传和下载功能
2020/12/31 Python
What is EJB
2016/07/22 面试题
土木工程个人自荐信范文
2013/11/30 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
安全月宣传标语
2014/10/07 职场文书
银行授权委托书格式
2014/10/10 职场文书
2014年团总支工作总结
2014/11/21 职场文书
工作保证书
2015/01/17 职场文书
舞出我人生观后感
2015/06/16 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
微信小程序实现聊天室功能
2021/06/14 Javascript