美文网首页每天学点Python
Python 的内建对象

Python 的内建对象

作者: 牧歌_ | 来源:发表于2015-06-27 09:33 被阅读1035次

如果你已经学习了包,模块这些知识了。
你会不会有好奇:Python为什么可以直接使用一些内建函数,不用显式的导入它们,比如 str() int() dir() ...?
原因是Python解释器第一次启动的时候 __builtins__ 就已经在命名空间了(Note: 有s)

进Shell看看:

>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, 
'__name__': '__main__', '__doc__': None, '__package__': None}

<br />
你可以再次导入 __builtin__(Note: 没有s):

import __builtin__
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, 
'__name__': '__main__', '__doc__': None, '__builtin__': 
<module '__builtin__' (built-in)>, '__package__': None}

<br />
这时候多了一个 __builtin__ 对象,你可以判断它们是不是相同的:

>>> __builtin__ is __builtins__
True
>>> type(__builtin__)
<type 'module'>
>>> type(__builtins__)
<type 'module'>

<br />
现在我们把它从一个文件导入:

# 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
"""

<br / >

结论:

__builtins__ 是对内建模块 __builtin__ 的引用,并且有如下两个方面差异:

在主模块中,即没有被其他文件导入。__builtins__是对 __builtin__ 本身的引用,两者是相同的。

通过 __builtins__ is __builtin__.__dict__ 猜想:
在非 '__main__' 模块中,也就是模块被导入后,__builtins__ 应该属于 __builtin__.__dict__ 的一部分,是对 __builtin__.__dict__ 的引用,而非builtin本身,它在任何地方都可见,此时builtins的类型是字典。

<br / >

装饰内建函数

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()
# 将会全部转为大写输出

<br />
Note:Python3.X版本中,内建模块更名为builtins,与Python2.X有所不同

<br />

参考:

Python所有内建函数
__builtin__ 与 __builtins__ 的区别与关系
What's the deal with __builtins__ vs __builtin__

相关文章

  • Python源码剖析笔记4-内建数据类型

    Python源码剖析笔记4-内建数据类型 Python内建数据类型包括整数对象PyIntObject,字符串对象P...

  • Python 的内建对象

    如果你已经学习了包,模块这些知识了。你会不会有好奇:Python为什么可以直接使用一些内建函数,不用显式的导入它们...

  • Python 整数对象的实现

    Python 的内建对象存放在源代码的Objects目录下。intobject.c用于整数对象 在 Python ...

  • 《python源码剖析》阅读笔记

    第一章 python的内建对象 python中一切都是对象。在PyIntObject中定义了很多函数指针,这些函数...

  • python2.1 数据类型(int&内建函数)

    一. 内建函数 所谓内建函数,就是能够在 Python 中直接调用,不需要做其它的操作 (1)id()查看每个对象...

  • 10.元类

    元类的对象是类type是python的内建元类 自定义元类:

  • 序列

    在Python中有六种内建的序列:列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。 ...

  • Python基础3:对象和序列数据类型

    一、对象 所有的 Python 对象都拥有三个特性:身份,类型和值。 身份 对象的唯一标识,对象的身份可以使用内建...

  • python核心编程-文件和输入输出

    本章将介绍python的文件处理和相关输入输出能力。包括介绍文件对象(它的内建函数、内建方法和属性)、标准文件、同...

  • 2018-12-27

    Python 的字符串内建函数 Python 的字符串常用内建函数如下:

网友评论

    本文标题:Python 的内建对象

    本文链接:https://www.haomeiwen.com/subject/jleeqttx.html