浅析python中特殊文件和特殊函数


Posted in Python onFebruary 24, 2022

导入模块

模块通常为单独的.py文件,可以用import直接引用,可以作为模块的文件类型有.py、.pyo、.pyc、.pyd、.so、.dll在导入模块时,解释器做以下工作:

  • 已导入模块的名称创建新的命名空间,通过该命名空间就可以访问导入模块的属性和方法。
  • 在新创建的命名空间中执行源代码文件。
  • 创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量

import 语句可以在程序的任何位置使用,你可以在程序中多次导入同一个模块,但模块中的代码仅仅在该模块被首次导入时执行。后面的import语句只是简单的创建一个到模块名字空间的引用而已。sys.modules字典中保存着所有被导入模块的模块名到模块对象的映射。

导入包

多个相关联的模块组成一个包,即多个.py文件构成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。一般来说,包的结构可以是这样的:

package
  |- subpackage1
      |- __init__.py
      |- a.py
  |- subpackage2
      |- __init__.py
      |- b.py

有以下几种导入方式

import subpackage1.a # 将模块subpackage.a导入全局命名空间,例如访问a中属性时用subpackage1.a.attr
from subpackage1 import a # 将模块a导入全局命名空间,例如访问a中属性时用a.attr_a
from subpackage1.a import attr_a # 将模块a的属性直接导入到命名空间中,例如访问a中属性时直接用attr_a

使用from语句可以把模块直接导入当前命名空间,from语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间

可以被import语句导入的对象是以下类型:

  • 模块文件(.py文件)
  • C或C++扩展(已编译为共享库或DLL文件)
  • 包(包含多个模块)
  • 内建模块(使用C编写并已链接到Python解释器中)

特殊文件

1、__init__.py文件

__init__.py文件的作用就是将该文件所处的文件夹当做一个模块来管理,每当有外部文件来import的时候,就会执行里面的函数

__init__.py是怎么工作的

当一个目录下含有这个文件,则这个文件夹就是一个python模块,通常__init__.py文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。

当import导入该模块时,同时会执行该文件内容,当导入该模块中的某个函数时需要加上该包名,不然就会报错,如下,当在其他文件中要导入子包subpackage_1中的test11函数时,需要加上包名mypackage

from mypackage.subpackage_1 import test11

__init__.py中还有一个重要的变量,__all__, 它用来将模块全部导入。

# __init__.py
__all__ = ['os', 'sys', 're', 'urllib']
# a.py
from package import *

这时就会把注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来。在了解了__init__.py的工作原理后,应该能理解该文件就是一个正常的python代码文件。因此可以将初始化代码放入该文件中。

2、.pyc与 .pyo文件

.py文件在汇编时,会生成.pyc文件,在汇编时,会将.py文件中的import的文件链接起来汇编成字节码写到一个.pyc文件中,后面执行时,就直接执行.pyc文件,省去每次都要重新汇编,提高运行速度,(当.py文件的修改时间发生改变,这样会生成新的.pyc文件)在解释器使用-O选项时,将使用同名的.pyo文件,这个文件去掉了断言(assert)、断行号以及其他调试信息,体积更小,运行更快。(使用-OO选项,生成的.pyo文件会忽略文档信息)

特殊函数

1、构造函数

构造函数是一种特殊的类成员方法,主要用在创建对象时初始化对象
python中的构造函数用__init__命名

2、析构函数

析构函数是构造函数的反函数,在销毁对象时调用他们,往往用来做清理善后,
例如:数据库连接对象可以在析构函数中释放对数据库实例资源的占用
python中为类定义析构函数的方法是在类中定义一个名为__del__的没有返回值和参数的函数
python中显示销毁对象的方法,使用del关键

3、静态函数和类函数

python中支持两种基于类名访问成员函数:静态函数和类函数
不同点:类函数有一个隐形参数cls可以用来获取类信息
静态函数使用装饰器@staicmethod定义
类函数使用装饰器@classmethod定义

4、以下划线开头的函数

  • 单前导下划线:_var
  • 单末尾下划线:var_
  • 双前导下划线:__var
  • 双前导和末尾下划线:__var__
  • 单下划线:_

单线划:_var

下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅供内部使用。 该约定在PEP 8中有定义。这不是Python强制规定的。 Python不像Java那样在“私有”和“公共”变量之间有很强的区别。

如果使用通配符从模块中导入所有名称,则Python不会导入带有前导下划线的名称(除非模块定义了覆盖此行为的__all__列表)

# This is my_module.py:

def external_func():
   return 23
def _internal_func():
   return 42
>>> from my_module import *
>>> external_func()
23
>>> _internal_func()
NameError: "name '_internal_func' is not defined"

与通配符导入不同,常规导入不受前导单个下划线命名约定的影响:

>>> import my_module
>>> my_module.external_func()
23
>>> my_module._internal_func()
42

单末尾下划线 var_

有时候,一个变量的最合适的名称已经被一个关键字所占用。 因此,像class或def这样的名称不能用作Python中的变量名称。 在这种情况下,你可以附加一个下划线来解决命名冲突,总之,单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。 PEP 8解释了这个约定。

双前导下划线:__var

到目前为止,我们所涉及的所有命名模式的含义,来自于已达成共识的约定。 而对于以双下划线开头的Python类的属性(包括变量和方法),情况就有点不同了。双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突。这也叫做名称修饰(name mangling) — 解释器会更改变量的名称,以便在类被扩展的时候不容易产生冲突。对于该属性的调用可以通过方法调用,而不能直接调用该属性,类似实现属性的私有,例如:

class ManglingTest:
   def __init__(self):
       self.__mangled = 'hello'
   def get_mangled(self):
       return self.__mangled
>>> ManglingTest().get_mangled() # 通过方法获取该函数的值
'hello'
>>> ManglingTest().__mangled # 直接调用该属性时会报错
AttributeError: "'ManglingTest' object has no attribute '__mangled'"

但我们依然可以通过特殊方法来直接获取该属性的值,即通过(_类名__属性)的方式获取,例如

>>> ManglingTest()._ManglingTest__mangled
'hello'

所以在python中并没有真正的私有变量,python解释器会自动将__var修饰为: _类名__属性,该特性对于以双下划线开头的方法依然适用

class MangledMethod:
   def __method(self):
       return 42
   def call_it(self):
   	  return self.__method()
>>> MangledMethod().__method() # 直接调用该方法会报错
AttributeError: "'MangledMethod' object has no attribute '__method'"
>>> MangledMethod().call_it()
42
>>> MangledMethod()._MangledMethod__method() # 通过该形式也是可以调用该方法
42

双前导和双末尾下划线 var

如果一个名字同时以双下划线开始和结束,则不会应用名称修饰。不同于仅有双下滑线开头的变量或函, 由双下划线前缀和后双下滑线包围的变量不会被Python解释器修改,但是,Python保留了有双前导和双末尾下划线的名称,用于特殊用途。 这样的例子有,__init__(对象构造函数),或__call__(该函数是使得一个对象可以被调用)最好避免在自己的程序中使用以双下划线开头和结尾的名称,以避免与将来Python语言的变化产生冲突。

单下划线

按照习惯,有时候单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的。

例如,在下面的循环中,我们不需要访问正在运行的索引,我们可以使用“_”来表示它只是一个临时值:

>>> for _ in range(32):
...    print('Hello, World.')
>>> car = ('red', 'auto', 12, 3812.4)
>>> color, _, _, mileage = car
>>> color
'red'
>>> mileage
3812.4
>>> _
12

到此这篇关于python中特殊文件和特殊函数的文章就介绍到这了,更多相关python特殊文件和特殊函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中列表(list)操作方法汇总
Aug 18 Python
python实现中文输出的两种方法
May 09 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
May 24 Python
python将unicode转为str的方法
Jun 21 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
Flask解决跨域的问题示例代码
Feb 12 Python
Python实现二维数组输出为图片
Apr 03 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
Python命令行click参数用法解析
Dec 19 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
Pygame Event事件模块的详细示例
Nov 17 Python
详解Python中的for循环
Apr 30 Python
Python中字符串对象语法分享
Feb 24 #Python
Python+Matplotlib+LaTeX玩转数学公式
Python语言内置数据类型
Feb 24 #Python
Python中的程序流程控制语句
Feb 24 #Python
python中对列表的删除和添加方法详解
Feb 24 #Python
通过Python把学姐照片做成拼图游戏
Python帮你解决手机qq微信内存占用太多问题
Feb 15 #Python
You might like
PHP在线书签系统分享
2016/01/04 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
php批量删除操作代码分享
2017/02/26 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
python分析作业提交情况
2017/11/22 Python
使用python实现ANN
2017/12/20 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
房屋继承公证书
2014/04/10 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书