Python
导入与使用模块和包
导入与使用
模块
导入全部
代码示例:
# foo.py
class Foo:
def myName(self):
print('foo')
def add(*args):
a = 0
for i in args:
a += i
return a
name = 'bar'
# bar.py
import foo
mylist = [7, 2, 1]
P01 = foo.add(*mylist)
print(P01)
print(foo.name)
P02 = foo.Foo()
P02.myName()
'''
10
bar
foo
'''
导入指定部分
代码示例:
# foo.py
class Foo:
def myName(self):
print('foo')
def add(*args):
a = 0
for i in args:
a += i
return a
name = 'bar'
# bar.py
from foo import name, Foo # import *(导入全部)
print(name)
P = Foo()
P.myName()
'''
bar
foo
'''
# foo.py
__all__ = ['name'] # 列表里的方法名为允许调用的方法(非列表内的则调用不了,但是对应模块的内容也会相应地全部预载到内存中)
def foo():
print('foo')
name = 'bar'
# bar.py
from foo import *
print(name) # bar
foo() # 报错(找不到方法名)
防止预载时的全局调用
代码示例:
# foo.py
def foo():
print('foo')
foo()
name = 'bar'
print(name)
# bar.py
from foo import name
'''
foo
bar
'''
# foo.py
def foo():
print('foo')
if __name__ == '__main__': # 把全局方法调用写入if中就不会在预载内存时执行一次,而是仅限于foo.py模块自己执行(__name__在模块内的值是__main__,而在模块外的值是模块名)
foo()
name = 'bar'
print(name)
# bar.py
from foo import name
包
- 包(Python_Package)
- 存放py文件
- 文件夹(Directory)
- 存放非py文件(图片、视频、文档等)
代码示例:
'''
1. 文件夹转换包
· 在文件夹里面新建一个__init__.py文件
2. 概念
· 一个包中可以存放多个模块
· 一个模块可以存放多个类、函数、变量
3. 包含关系
· 项目 > 包 > 模块 > 类、函数、变量
示例结构:
├── myfiles
│ └── foo.py
'''
# 导入方法01:
from myfiles import foo
print(foo.name) # foo
# 导入方法02:
from myfiles.foo import name
print(name) # foo
# __init__.py
'''
1. 说明
· 只要导入包,默认执行__init__模块到内存中(初始化加载,优先级最高)
2. 区别
· 在模块内(模块开放的模块方法权限)
· 在包的__init__.py文件(包内开放的模块调用权限,不针对包外调用)
'''
__all__ = ['foo'] # 仅开放foo.py模块的调用权限
# 模块循环导入问题:
'''
# foo.py
def a():
b()
# bar.py
def b():
a()
导入方法预载到内存时,会执行一遍模块中的内容,则置顶可能会导致死循环导入(特别是全局代码)
'''
'''
1. 解决办法
· 重构项目
· 在函数体内导入方法
· 规避函数的全局调用
· 导入方法的顺序放到模块的最后面
'''