深入解析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压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
python中nan与inf转为特定数字方法示例
May 11 Python
Python实现的双色球生成功能示例
Dec 18 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
利用Python计算KS的实例详解
Mar 03 Python
Python实现Canny及Hough算法代码实例解析
Aug 06 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 Python
使用python创建股票的时间序列可视化分析
Mar 03 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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
JQuery与iframe交互实现代码
2009/12/24 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
div失去焦点事件实现思路
2014/04/22 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python读取Excel的方法实例分析
2015/07/11 Python
python3中str(字符串)的使用教程
2017/03/23 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
Python实现全排列的打印
2018/08/18 Python
python 字典访问的三种方法小结
2019/12/05 Python
如何利用python生成MD5并去重
2020/12/07 Python
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
销售人员中英文自荐信
2013/09/22 职场文书
学员自我鉴定
2014/03/19 职场文书
财务人员担保书
2014/05/13 职场文书
高中团支书竞选稿
2015/11/21 职场文书
Python机器学习之基础概述
2021/05/19 Python
python使用pymysql模块操作MySQL
2021/06/16 Python