深入解析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下载文件时显示下载进度的方法
Apr 02 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
Mar 02 Python
python PyTorch预训练示例
Feb 11 Python
python实现关键词提取的示例讲解
Apr 28 Python
python读取文本中的坐标方法
Oct 14 Python
pygame游戏之旅 添加游戏介绍
Nov 20 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
bluepy 一款python封装的BLE利器简单介绍
Jun 25 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 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函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
浅谈PHP封装CURL
2019/03/06 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
javascript 精粹笔记
2010/05/09 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
javascript操作符&quot;!~&quot;详解
2015/02/10 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
Python 字典dict使用介绍
2014/11/30 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
python unittest实现api自动化测试
2018/04/04 Python
python 读取DICOM头文件的实例
2018/05/07 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
行政人事岗位职责
2014/03/17 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
2015年幼儿园班主任工作总结
2015/05/12 职场文书
房产遗嘱范本
2015/08/06 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP