国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入解析Python中的__builtins__內建對象

2019-11-25 16:42:26
字體:
來源:轉載
供稿:網友

如果你已經學習了包,模塊這些知識了。
你會不會有好奇: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.pyimport __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.pyimport file1"""結果:module name __name__ : file__builtin__ is __builtins__: Falsetype(__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有所不同

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沂南县| 南投县| 洛扎县| 迭部县| 扎鲁特旗| 奈曼旗| 巴里| 淳安县| 夹江县| 雅江县| 崇信县| 汉沽区| 阳西县| 兴国县| 依兰县| 奈曼旗| 济南市| 清远市| 永宁县| 鄂伦春自治旗| 德化县| 巴林右旗| 达拉特旗| 济宁市| 囊谦县| 德兴市| 汤原县| 郧西县| 奉新县| 蓬溪县| 南江县| 措勤县| 揭西县| 永春县| 日土县| 满洲里市| 龙江县| 图片| 互助| 卓尼县| 博乐市|