深入解析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中join 和 split详解(推荐)
Jun 30 Python
python实现单线程多任务非阻塞TCP服务端
Jun 13 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
python给微信好友定时推送消息的示例
Feb 20 Python
python向字符串中添加元素的实例方法
Jun 28 Python
python实现连连看游戏
Feb 14 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
python实现自动打卡的示例代码
Oct 10 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 Python
python实现简易自习室座位预约系统
Jun 30 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 错误之引号中使用变量
2009/05/04 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
小试JQuery的AutoComplete插件
2011/05/04 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
基于JQuery及AJAX实现名人名言随机生成器
2017/02/10 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
Python Mysql自动备份脚本
2008/07/14 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
基于python的selenium两种文件上传操作实现详解
2019/09/19 Python
Django-migrate报错问题解决方案
2020/04/21 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
华润集团网上药店:健一网
2016/09/19 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
法国足球商店:Footcenter
2019/07/06 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
优秀应届毕业生自荐信
2013/11/16 职场文书
社团招新策划书
2014/02/04 职场文书
高中班级口号
2014/06/09 职场文书
医德考评自我评价
2014/09/14 职场文书
公司授权委托书范文
2014/09/21 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
教育教学工作反思
2016/02/24 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers