深入解析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安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
深入探究Django中的Session与Cookie
Jul 30 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
python写入已存在的excel数据实例
May 03 Python
PyCharm配置mongo插件的方法
Nov 30 Python
解决Python 使用h5py加载文件,看不到keys()的问题
Feb 08 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 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
一个更简单的无限级分类菜单代码
2007/01/16 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
WAF的正确bypass
2017/01/05 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
2019/05/29 PHP
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
Ext.MessageBox工具类简介
2009/12/10 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
详解js中==与===的区别
2017/01/08 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
Python中super()函数简介及用法分享
2016/07/11 Python
TensorFlow实现模型评估
2018/09/07 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
Wallis官网:英国女装零售商
2020/01/21 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
护士毕业实习感言
2014/03/05 职场文书
规划编制实施方案
2014/03/15 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
终止劳动合同通知书
2015/04/16 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
Python制作一个随机抽奖小工具的实现
2021/07/07 Python