python-6.模块
2018-04-01 21:26
106 查看
封装:
容器:数据的封装
函数:语句的封装
类:方法和属性的封装
模块:模块就是程序
第1行和第2行是标准注释,第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行,第2行注释表示.py文件本身使用标准UTF-8编码;
第4行是一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;
第6行使用_author_变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名;
以上就是Python模块的标准文件模板,当然也可以全部删掉不写,但是,按标准办事肯定没错。
后面开始就是真正的代码部分。
calc.py
运行calc.py
修改TemperaturnConversion.py
运行TemperaturnConversion.py
运行calc.py
模块与主程序放在同一个文件夹中,或着不在同一文件夹中,添加路径
2.在文件夹中创建一个
3.将相关模块放入文件中。
包和主程序在同一个文件夹中,导入包中的模块(包名为M1):
正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;
类似
类似
之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。
容器:数据的封装
函数:语句的封装
类:方法和属性的封装
模块:模块就是程序
导入模块:import
模块py文件和调用py文件要在一个文件夹中>>> import TemperatureConversion # >>> TemperatureConversion.c2f(32) >>> TemperatureConversion.f2c(99) >>> from TemperatureConversion import c2f,f2c # >>> c2f(32) >>> f2c(99) >>> import TemperatureConversion as tc #推荐 >>> tc.c2f(32) >>> tc.f2c(99) >>> from TemperatureConversion import * #不推荐,函数名会产生混乱,使命名空间的优势荡然无存 >>> c2f(32) >>> f2c(99)
模块的标准模板
#!/usr/bin/env python3 # -*- coding: utf-8 -*- ' a test module ' __author__ = 'Michael Liao'
第1行和第2行是标准注释,第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行,第2行注释表示.py文件本身使用标准UTF-8编码;
第4行是一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;
第6行使用_author_变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名;
以上就是Python模块的标准文件模板,当然也可以全部删掉不写,但是,按标准办事肯定没错。
后面开始就是真正的代码部分。
if _name_ == ‘_main_’
TemperaturnConversion.pydef c2f(cel): fah=cel*1.8+32 return fah def f2c(fah): cel=(fah-32)/1.8 return cel def text(): print('测试,0摄氏度=%.2f华氏度'% c2f(0)) print('测试,0华氏度=%.2f摄氏度'% f2c(0)) text()
calc.py
import TemperaturnConversion as tc print('32摄氏度=%.2f华氏度'% tc.c2f(32)) print('99华氏度=%.2f摄氏度'% tc.f2c(99))
运行calc.py
=================== RESTART: C:\Users\yue\Desktop\calc.py =================== 测试,0摄氏度=32.00华氏度#不需要打印出测试内容 测试,0华氏度=-17.78摄氏度#不需要打印出测试内容 32摄氏度=89.60华氏度 99华氏度=37.22摄氏度 >>> __name__ '__main__' >>> tc.__name__ 'TemperaturnConversion' >>>
修改TemperaturnConversion.py
def c2f(cel): fah=cel*1.8+32 return fah def f2c(fah): cel=(fah-32)/1.8 return cel def text(): print('测试,0摄氏度=%.2f华氏度'% c2f(0)) print('测试,0华氏度=%.2f摄氏度'% f2c(0)) if __name__=='__main__': text()
运行TemperaturnConversion.py
=========== RESTART: C:/Users/yue/Desktop/TemperaturnConversion.py =========== 测试,0摄氏度=32.00华氏度 测试,0华氏度=-17.78摄氏度 >>>
运行calc.py
=================== RESTART: C:\Users\yue\Desktop\calc.py =================== 32摄氏度=89.60华氏度 99华氏度=37.22摄氏度
搜索路径
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中。模块与主程序放在同一个文件夹中,或着不在同一文件夹中,添加路径
>>> import sys >>> sys.path ['', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\idlelib', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages'] >>> import TemperaturnConversion #产生错误 Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> import TemperaturnConversion ModuleNotFoundError: No module named 'TemperaturnConversion' >>> sys.path.append('C:\\Users\\yue\\Desktop') #这种方法是在运行时修改,运行结束后失效。 >>> sys.path ['', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\idlelib', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages', 'C:\\Users\\yue\\Desktop'] >>> import TemperaturnConversion #模块导入成功 >>>
包package
1.创建一个文件夹,文件夹的名字就是包的名字,用于存放相关模块;2.在文件夹中创建一个
__init__.py的模块文件,内容可以为空(表示这个文件夹为包);
3.将相关模块放入文件中。
包和主程序在同一个文件夹中,导入包中的模块(包名为M1):
import M1.TemperatureConversion as tc
标准库中自带的模块
>>> import timeit >>> timeit.__doc__ #__doc__属性:打印出文档。。。省略 >>> print(timeit.__doc__) #按照格式打印。。。省略 >>> dir(timeit) #打印出属性和方法名,也可以用于打印对象的属性和方法 ['Timer', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_globals', 'default_number', 'default_repeat', 'default_timer', 'dummy_src_name', 'gc', 'itertools', 'main', 'reindent', 'repeat', 'sys', 'template', 'time', 'timeit'] >>> timeit.__all__ #__all__属性包含的内容是作者希望外部可以调用的函数或属性或类 ['Timer', 'timeit', 'repeat', 'default_timer'] >>> from timeit import * #导入__all__中包含的所有 >>> Timer #可以调用 <class 'timeit.Timer'> >>> gc #不可以调用 Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> gc NameError: name 'gc' is not defined >>> >>> import timeit >>> timeit.__file__ #源代码所在的位置 'C:\\Users\\yue\\AppData\\Local\\Programs\\Python\\Python36\\lib\\timeit.py' >>> help(timeit) #比__doc__属性更加详细一些
作用域
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;
类似
__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的
__author__,
__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量
__doc__访问,我们自己的变量一般不要用这种变量名;
类似
_xxx和
__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如
_abc,
__abc等;
之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。
相关文章推荐
- python获取硬件信息模块
- Python学习之路:一些BIF+魔法方法+模块
- python学习笔记(locust性能测试模块)
- Python模块之argparse
- python中sys模块的用法大全
- python导入上级目录中的模块
- 一行一步一花新:python-3:python中的random模块
- 用Python写一个发邮件模块
- python logging 模块
- Python学习5:__name__使用以及自定义模块
- centos 7 下的python psutil模块
- Python模块扩展之AES算法
- python模块:doctest,unitest模块
- win32下 xgboost 模块安装python2.7
- 50个很棒的Python模块
- python下paramiko模块实现ssh连接登录Linux服务器
- python常见模块命令(os/sys/platform)
- 人生苦短之我用Python篇(paramiko模块)
- python与python模块numpy安装
- python的学习笔记之——time模块常用内置函数