深入解析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写的Socks5协议代理服务器
Aug 06 Python
Python实现过滤单个Android程序日志脚本分享
Jan 16 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
Oct 12 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
Python实现生成随机数据插入mysql数据库的方法
Dec 25 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
详解Python sys.argv使用方法
May 10 Python
python+selenium+PhantomJS抓取网页动态加载内容
Feb 25 Python
在pycharm中创建django项目的示例代码
May 28 Python
python执行js代码的方法
May 13 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
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
Python实现Dijkstra算法
2018/10/17 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
执行Python程序时模块报错问题
2020/03/26 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
python 基于PYMYSQL使用MYSQL数据库
2020/12/24 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
护士自我评价范文
2014/01/25 职场文书
爱与责任演讲稿
2014/05/20 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
会计稽核岗位职责
2015/04/13 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
以下牛机,你有几个
2022/04/05 无线电