深入解析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从网络读取图片并直接进行处理的方法
May 22 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
如何使用Python标准库进行性能测试
Jun 25 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 Python
详解Python self 参数
Aug 30 Python
Python函数参数类型及排序原理总结
Dec 19 Python
如何搭建pytorch环境的方法步骤
May 06 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
python 制作简单的音乐播放器
Nov 25 Python
python 检测图片是否有马赛克
Dec 01 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 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 CURL获取邮箱地址的详解
2013/06/03 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
vue多次循环操作示例
2019/02/08 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
jQuery实现轮播图效果
2019/11/26 jQuery
详解Python当中的字符串和编码
2015/04/25 Python
Python语法快速入门指南
2015/10/12 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
工程现场管理求职自荐信
2013/10/02 职场文书
面包店的创业计划书范文
2014/01/16 职场文书
领导干部考察材料
2014/02/08 职场文书
应届毕业生自荐信
2014/05/28 职场文书
鲁迅故里导游词
2015/02/05 职场文书
白银帝国观后感
2015/06/17 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python