深入解析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实现过滤单个Android程序日志脚本分享
Jan 16 Python
为Python的web框架编写MVC配置来使其运行的教程
Apr 30 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
python操作oracle的完整教程分享
Jan 30 Python
python 读入多行数据的实例
Apr 19 Python
在CMD命令行中运行python脚本的方法
May 12 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
Python文字截图识别OCR工具实例解析
Mar 05 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
python退出循环的方法
Jun 18 Python
pandas统计重复值次数的方法实现
Feb 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
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
基于jquery实现的鼠标拖拽元素复制并写入效果
2011/08/23 Javascript
document.getElementBy(&quot;id&quot;)与$(&quot;#id&quot;)有什么区别
2013/09/22 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
React-Router如何进行页面权限管理的方法
2017/12/06 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
python回调函数的使用方法
2014/01/23 Python
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
python中字符串的编码与解码详析
2020/12/03 Python
德国网上花店:Valentins
2018/08/15 全球购物
什么是接口(Interface)?
2013/02/01 面试题
高三学生评语大全
2014/04/25 职场文书
读书小明星事迹材料
2014/05/03 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
护士自我推荐信范文
2015/03/24 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python
redis数据结构之压缩列表
2022/03/21 Redis