深入解析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基于Pymssql模块实现连接SQL Server数据库的方法详解
Jul 20 Python
CentOS下使用yum安装python-pip失败的完美解决方法
Aug 16 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
May 08 Python
python使用matplotlib画饼状图
Sep 25 Python
python实现控制台打印的方法
Jan 12 Python
python 设置输出图像的像素大小方法
Jul 04 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
自学python用什么系统好
Jun 23 Python
python如何使用代码运行助手
Jul 03 Python
Python使用itcaht库实现微信自动收发消息功能
Jul 13 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 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效率,提高php性能的一些方法
2011/03/24 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
python进阶教程之循环对象
2014/08/30 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
使用python+whoosh实现全文检索
2019/12/09 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
医护人员英文求职信范文
2013/11/26 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
公司租房协议书
2014/10/14 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
师范生教育见习总结
2015/06/23 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
Go 语言结构实例分析
2021/07/04 Golang
python基础之模块的导入
2021/10/24 Python
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js