浅析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标准库之多进程(multiprocessing包)介绍
Nov 25 Python
在Python编程过程中用单元测试法调试代码的介绍
Apr 02 Python
利用python编写一个图片主色转换的脚本
Dec 07 Python
Python进度条实时显示处理进度的示例代码
Jan 30 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
Python实现Event回调机制的方法
Feb 13 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
Python类继承和多态原理解析
Feb 05 Python
浅谈keras中loss与val_loss的关系
Jun 22 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 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
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
php-app开发接口加密详解
2018/04/18 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
Yii 框架入口脚本示例分析
2020/05/19 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
解决FLASH需要点击激活的代码
2006/12/20 Javascript
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
JS通过位运算实现权限加解密
2018/08/14 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
python绘制封闭多边形教程
2020/02/18 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
python TCP包注入方式
2020/05/05 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
驻村工作先进事迹
2014/08/14 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
Docker官方工具docker-registry案例演示
2022/04/13 Servers