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

  1. 包(Python_Package)
    • 存放py文件
  2. 文件夹(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. 解决办法
    · 重构项目
    · 在函数体内导入方法
    · 规避函数的全局调用
    · 导入方法的顺序放到模块的最后面
'''