Python-8-Python模块
8-1 Pycharm 安装
http://www.jetbrains.com/pycharm/ 选 Download 下载,下载 Community 社区版本,此时就已经在下载了。
安装过程中勾选"64-bit launcher","Add launcher dir to PATH",".py".
首次启动,不安装插件,直接启动。需要添加python解释器,设置字体。
8-2 介绍Python项目组织结构
包(文件夹)下面是模块(文件),文件里面是业务逻辑。
在工程名test上右键,New,Python Package 创建一个包,包名假设为lib,当创建一个包后在包下面会自动生成一个 __init__.py 文件,这个文件就声明了其所在目录名是一个包(没有这个文件的,父目录只是一个文件夹)。若在工程test目录上,手动右键,New,Python File 创建一个名为 __init__.py 文件的话,此时工程目录test文件夹也变成了一个包。
还可以在一个包里面创建很多个子包,在子包里面可以创建很多个模块,在lib上右键,New,PythonFile,创建第一个模块,假设指名为p1.py,再创建一个指定名为p2.py.
8-3 import 导入模块
1. 在同一个包中
在 p1.py 中定义三个变量
a = 1
b = 2
c = 3
在 p1.py 中引用这三个变量,import p1 报错,Pycharm的问题,在libs目录上右键,Mark Directory as,Source Root 就可以了。右键,Run就可以正常被打印了。
import p1
print(p1.a, p1.b, p1.c) #通过<模块名>.<变量名>进行引用
Python允许给模块取个别名,下面也是可以的:
import p1 as t
print(t.a, t.b, t.c)
2. 不在同一个包(目录)中
在工程test目录上右键创建一个 main.py 文件,与 libs/p1.py 不在同一个包中,也即从外面的包中去引用子包中的模块
import libs.p1 print(libs.p1.a, libs.p1.b, libs.p1.c) #也可以取个别名 import libs.p1 as t print(t.a, t.b, t.c)
注:要运行哪个文件,就在哪个文件的编辑界面右键 Run <文件名>,比如 Run p2.py、Run main.py
8-4 from import 用法
from import 可以避免使用'.'的方式访问其它模块的变量,它导入的不是模块名,而是具体的变量。
1. 在同一个包下的 p2.py 中执行:
from p1 import a, b, c #从p1模块中导入abc print(a, b, c)
2. 不在同一个包下的 mian.py 中执行:
from libs.p1 import a, b, c #需要将p1所在的包名给带上 print(a, b, c) #也可以 from libs.p1 import * #表示将p1模块内的所有内容都导入进来 print(a, b, c)
3. 在原模块中可以指定哪些变量是可被导入的
在 p1.py 中,使用 __all__ 指明只有 a 这个变量是可以被导入的。
__all__ = ['a'] a=1 b=2 c=3
总结:使用 from import 会比 import 更加方便,不用导入模块,直接导入变量、函数、类。
8-5 __init__.py 特点
__init__.py 特点:
1. 声明一个文件夹为一个包
2. import包。实际是 import 这个包下面的 __init__.py 这个模块。
3. 该模块名为一个包名。__init__.py 的模块名是包的名字。
4. 自定义选择哪些模块可以被导入。
#main.py 中:
import libs #这不是导入模块,而是导入一个包(libs是一个文件夹)########
#或
from libs import p1
#libs/__init__.py 中:
print('this is libs.__init__.py');
print(__name__) #查看此模块的名字,打印'libs'
当在 main.py 文件中右键 Run main.py 执行时,'this is libs.__init__.py'被打印了。当我们 import 一个包时,它 import 的是包下面的 __init__.py 这个模块。
__init__.py 可以指定哪些模块是可以被导入的:
#libs/__init__.py 中:
__all__ = ['p1'] #指明此包下只有模块p1是可以被导入的。若想让p2也是可以被导入的,可以 __all__ = ['p1', 'p2']
#main.py中
from libs import *
print(p1.a) #成功
print(p2.a) #报错,不可被导入
8-6 __name__ 的应用
print(__name__) #打印当前模块的模块名
#p1.py中: def add(x, y) sum = x + y print(sum) return sum add(3, 4) #右键运行当前文件可立即测试 #main.py中: from libs.p1 import add add(5, 5)
此时在 main.py 中右键,Run main.py 发现 p1.py 中的 add(3, 4) 也执行了,若不行让其执行的话,可以:
#p1.py中d调用add函数位置改为 if __name__ == '__main__' #表示只有从当前模块去执行的话才会执行里面的内容 add(3, 4)
表示只有运行 p1.py 时才会还行 add(3, 4),若是从其它模块导入执行的话,不会再执行 add(3, 4) 了。此时再在 main.py 中执行就只返回10了。
再举一个例子:
#p2.py中 if __name__ == '__main__' print('Hello pycharm') print('Hello world') #main.py中 from libs import p2
在p2.py中右键执行,两个都会打印,在main.py中右键执行,只会打印'Hello world'。
posted on 2023-08-01 15:28 Hello-World3 阅读(14) 评论(0) 编辑 收藏 举报