python内置属性_python进阶之py文件内置属性

news/2024/7/6 0:57:09

前言

对于任何一个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__) #

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': , 'return': }

函数的参数和返回值如果在定义的时候指定了类型,那么它们就会以键值对的形式记录到函数的__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__属性.

参考


http://www.niftyadmin.cn/n/3003992.html

相关文章

golang 时间戳_使用 golang 内置模块实现网站TLS证书过期日期查询

由于前段时间出现过大公司域名证书未及时更新导致服务中断&#xff0c;之前也有了解过 golang。闲来无事&#xff0c;于是用了半天的时间&#xff0c;通过 golang 官网文档&#xff0c;写了一个小工具&#xff0c;来获取域名证书的到期时间。证书信息通过传参 -d 域名 来获取本…

雨林木风系统封装工具封装xp_U盘安装最新版WIN10系统

今天终于搞定了U盘安装最新版Win10系统。由于我的DELL笔记本是UEFI引导&#xff0c;U盘烧镜像文件时&#xff0c;需格式化为FAT32格式(NTFS格式不能引导)。最新版Win10(2019年12月版)镜像中有一个install.wim的文件大小为4.11GB&#xff0c;而FAT32格式的U盘不能写入超过4GB的单…

sift源码_SLAM论文和源码解读-写在前面

这个专栏第一大部分主要是slam方面的论文和源码解读&#xff0c;从技术领域可分为激光slam和视觉slam&#xff0c;同时视觉slam中语义slam已经成为一个重要的分支&#xff0c;所以我们把它单独提出来作为一部分。激光slam虽然也有很多结合语义的&#xff0c;但是它在方法上和论…

微信小程序[登录流程以及无感刷新流程]

网上找到两篇比较优秀的内容文章&#xff0c;因此就不做探究了 参考文章&#xff1a; 1.https://blog.csdn.net/weixin_34237596/article/details/88685505 2.https://blog.csdn.net/dwb123456123456/article/details/84251932

springMVC之@InitBinder与 @ModelAttribute的用法

转载自&#xff1a; https://blog.csdn.net/wang0907/article/details/108357696 简言之InitBinder就是应用到所有RequestMapping注解方法&#xff0c;在其执行之前初始化数据绑定器。 ModelAttribute就是给当前controller类下的所有请求方法添加数据。 ControllerAdvice pub…

python创建类实例方法_Python 如何通过类方法创建实例方法?

下面是 Python 3.x language reference 中的一段话&#xff0c;大意是理解的&#xff0c;不过写不出一个这样的示例&#xff0c;求大神给个与这段话一致的示例&#xff1a;When an instance method object is derived from a class method object, the “class instance” stor…

JVM虚拟机(二):堆、栈、方法区概念区别

Java 堆 Java堆是和Java应用程序关系最密切的内存空间&#xff0c;几乎所有的对象都放在其中&#xff0c;并且Java堆完全是自动化管理&#xff0c;通过垃圾收集机制&#xff0c;垃圾对象会自动清理&#xff0c;不需自己去释放。 根据垃圾回收机制的不同&#xff0c;Java堆有可能…

各路由协议的协议号_2020春节档,各路高手巅峰对决?鹿死谁手

《宠爱》12月31日上映&#xff0c;元旦期间连续两天票房破亿&#xff0c;电影的热度是近期新上映的电影中最高的一部。《宠爱》在豆瓣开画评分仅6.3&#xff0c;所以说档期选的好&#xff0c;容易出爆款&#xff1b;那么大年初一的上映的各路高手将迎来巅峰对决&#xff0c;那么…