python进阶之py文件内置属性
前言
对于任何一个python文件来说,当python解释器运行一个py文件,会自动将一些内容加载到内置的属性中;一个模块我们可以看做是一个比类更大的对象。
查看模块的内置属性
我们先创建一个典型的py文件
# test.py
# -*- coding: utf-8 -*-
"""
some doc
"""
import os
var1 = None
class Person(object):
pass
if __name__ == "__main__":
print(dir()) # ['Person', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'os', 'var1']
通过dir()方法我们可以获取到该模块的所有的显式或隐式的属性或方法;可看到隐式的属性有__annotations__,__builtins__,__cached__,__annotations__,__doc__,__file__,__loader__,__name__;
我们打印一下每个魔法属性:
print(__name__) # __main__
print(__annotations__) # {}
print(__builtins__) # <module 'builtins' (built-in)>
print(__cached__) # None
print(__doc__) # some doc
print(__file__) # .../test.py
print(__loader__) # <_frozen_importlib_external.SourceFileLoader object at 0x000002398E831F28>
print(__package__) # None
print(__spec__) # None
# 其中__name__、__doc__、__file__、__package__是可以直接使用的,其它的内置属性一般不允许直接使用。
内置魔法属性
- _name_
该属性代表当前模块的名字,每个py文件默认的属性,如果当前模块是主程序,值为“__main__”,如果不是主程序,值为模块名。这个属性经常用来区分主程序和作为被导入模块的程序。
- _builtins_
该属性代表内置模块builtins,即所有的内建函数、内置类型、内置异常等;在python执行一个py文件时,会将内置模块赋值给这个属性;如果不是主程序,那么这个属性是一个builtins模块所有方法的字典。
- _doc_
模块的说明文档,py文件初始化时,将文件开始的说明字符串赋值给这个属性。
- _file_
该属性代表文件的绝对路径,任何一个模块使用这个属性就可获得本模块的绝对路径;但是该属性只在windows环境下可用,在linux环境下不可用。
- _cached_
缓存文件,如果是主程序,那么该属性为None,其他模块的该属性指向该模块的pyc字节文件,这样在py文件不发生修改的情况下可以减少编译的时间,更快地加载上下文环境。
- _annotations_
该属性对于模块文件来说,没有开放给用户使用;但对于函数来说,这个方法用来记录参数的类型和返回值。
def get_sum(x,y):
return x + y
print(get_sum.__annotations__) # {}
def get_sum(x, y: int) -> int:
return x + y
print(get_sum.__annotations__) # {'y': <class 'int'>, 'return': <class 'int'>}
函数的参数和返回值如果在定义的时候指定了类型,那么它们就会以键值对的形式记录到函数的__annotations__属性中,但对于匿名函数来说,这个属性是不存在的。
- _loader_
该属性py3.3之前没有,引用了本模块的加载器对象,即该模块的上下文是由这个加载器加载到内存中的。
- _package_
该属性是一个文件是否是包的标志,在主程序中该属性的值永远是None,不要使用它;当一个包被导入到主程序中,该包的__package__属性为包的名字。
# test
--__init__.py
# main.py
import test
print(test.__package__) # test
- _spec_
该属性记录一个模块的详细信息,是一个ModuleSpec对象,
其他魔法属性
- _author_
该属性用来定义模块的作者信息,可以是字符串,也可以是列表、字典等数据结构。
# test.py
__author__ = {'auth':'tianyuzhiyou';'bg':'https://www.cnblogs.com/cwp-bg/'}
- _all_
该属性不是模块默认的,需要手动定义,它的功能有二:
记录一个模块有哪些重要的、对外开发的类、方法或变量等,或记录一个包哪些对外开放的模块;
限制导入,当使用“from xxx import *”形式导入时,实际导入的只有__all__属性中的同名的对象而不是所有,但对于“from xxx import xxx”指定了具体的名字则all属性被忽略。
魔法方法
- _import_
该魔法方法是import触发,即import os 相当于os = __import__('os'),也可以直接使用,主要用于模块延迟加载,或重载模块。
- 参数:
name:模块的名字;
global:包含全局变量的字典,采用默认值 global()
local:包含局部变量的字典,采用默认值 local()
fromlist:被导入的子模块的名称
level:指定使用绝对导入还是相对导入,0表示只执行绝对导入。
- 实例
# 设有文件目录
testx
--__init__.py
--name.py
--test
--__init__.py
--name.py
t = __import__('testx',fromlist=['name','test2']) # 导入testx包以及包内的name、test2模块
print(t.name) # t变量代表testx包,如果name不再fromlist中则不可用
t = __import__('testx.test2', fromlist=['name']) # 导入testx包的子包
print(t.name) # 代表testx.test2.name
__import__函数返回的是一个变量,代表一个模块,所有后续方法的调用都要在这个变量的基础上。
总结
对于众多的模块属性,python最常用的是__name__,__doc__,__author__,__all__.
python在执行import语句时,调用__import__方法,同时也做了对被导入模块的一些初始化工作,如:将被导入模块的名字赋值给被导入模块__name__,将被导入模块的绝对路径赋值给被导入模块__file__,将builtins模块的globals()赋值给被导入模块__builtins__,将被导入模块的说明赋值给被导入模块的_doc_,将被导入模块的编译字节文件路径赋值给被导入模块__cached__,创建一个ModuleSpec对象赋值给被导入模块的__spec__,如果被导入的是包,将包的名字赋值__package__属性.
参考
python进阶之py文件内置属性的更多相关文章
- python基础-7.2文件内置属性__doc__ __file__ __package__ __cached__ __name__
__doc__ #py文件开头的注释文字 __file__ #当前py文件的路径 __package__ #包含文件所在包,用 . 分隔,当前文件为None,导入的其他文件:指定文件所在包,用.分隔. ...
- Python进阶-XVIV 类的内置方法:__str__ 、__repr__、析构函数(__del__)、双下的call,eq,new,hash 以及item相关的三个方法
类的内置方法 它与内置函数有紧密的联系,有的内置函数就是调用的内置方法. 在顶级父类obj中有: 两个双下方法 obj.__str__ str(obj) obj.__repr__ repr(obj) ...
- Python进阶之浅谈内置方法(补充)
目录 列表类型的内置方法 元组类型的内置方法 字典类型的内置方法 集合类型的内置方法 列表类型的内置方法 1.作用:描述名字,说的话等 2.定义方式 s=['tim','age'] s=str('ti ...
- Python进阶之浅谈内置方法
目录 有序or无序和可变or不可变 数字类型内置方法 整形 浮点型 字符串类型内置方法 有序or无序和可变or不可变 有序:有索引 无序:无索引 可变:变量值变,id不变 不可变:变量值变,id也变 ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- $python正则表达式系列(3)——正则内置属性
本文主要总结一下python正则的一些内置属性的用法. 1. 编译标志:flags 首先来看一下re.findall函数的函数原型: import re print('[Output]') print ...
- Python学习day08-python进阶(2)-内置方法
Python学习day08-python进阶(2)-内置方法 列表数据类型内置方法 作用 描述多个值,比如爱好 定义方法 xxxxxxxxxx 2 1 hobby_list ...
- python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)
主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数. hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回Tr ...
- python成长之路八 -- 内置函数
1,python内置函数 内置函数 abs() dict() help() min() setattr() all() dir() hex() next() slice() a ...
随机推荐
- 利用SSH secure Shell实现windows与linux之间传输文件
在windows下安装SSH secure Shell.默认安装后有两个快捷方式. linux下需要安装openssh-server utuntu默认安装了opens是-client,所以不需要安装, ...
- 第166天:canvas绘制饼状图动画
canvas绘制饼状图动画 1.HTML <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- java 类型转型
- java map的 keyset()方法
- Innobackupx工具命令简单解析
--defaults-file 同xtrabackup的--defaults-file参数,指定mysql配置文件; --apply-log 对xtrabackup的--prepare参数的封装; - ...
- BZOJ4922 Karp-de-Chant Number(贪心+动态规划)
首先将每个括号序列转化为三元组(ai,bi,ci),其中ai为左括号-右括号数量,bi为前缀最小左括号-右括号数,ci为序列长度.问题变为在满足Σai=0,bi+Σaj>=0 (j<i)的 ...
- [AT2148] [arc063_c] Integers on a Tree
题目链接 AtCoder:https://arc063.contest.atcoder.jp/tasks/arc063_c 洛谷:https://www.luogu.org/problemnew/sh ...
- 浅谈Android发展趋势分析
去年11月16.17日,我有幸参加了北京2017安卓技术大会,做了关于车载Android系统的演讲,并主持了诸多大咖参与的圆桌讨论,对Android未来几年的发展趋势进行了一番讨论.来自小米.百度.高 ...
- bzoj1969: [Ahoi2005]LANE 航线规划(树链剖分)
只有删边,想到时间倒流. 倒着加边,因为保证图连通,所以一开始一定至少是一棵树.我们先建一棵树出来,对于每一条非树边,两个端点在树上这段路径的边就不会变成关键边了,所以将它们对答案的贡献删去,那么直接 ...
- 解决电脑各种 dll 文件丢失问题
https://jingyan.baidu.com/article/ae97a646f9dbfdbbfc461d6d.html 下载鲁大师,点右上角的 游戏库,然后再点右上角的 修复 ,一键修复即 ...