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编辑  收藏  举报

导航