""" 注意只要是调用模块,就是创建新名称空间,并在此新的名称空间下执行原模块文件里定义的所有代码
多模块导入,可以逗号来分 (import re,sys )可以为模块定义别名咯 import spam as pi ,调用时就用pi.名字
1.为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间。
2.在新创建的命名空间中执行模块中包含的代码
3.创建名字spam来引用该命名空间
4 事实上函数定义也是“被执行”的语句,模块级别函数定义的执行将函数名放入模块全局名称空间表,用globals()可以查看
print(globals())
'__name__': '__main__', '__cached__': None, 'getMoney': ,
'getFunc': , '__builtins__': , 'money': 1000, '__loader__': <_frozen_importlib_external.sourcefileloader object at>}
模块调用
A. import spam,会将源文件的名称空间'spam'带到当前名称空间中,使用时必须是spam.名字的方式(注意中import 后的那个名字 如果有点,则点左边只能是包名)
B. from 语句相当于import,也会创建新的名称空间,但是将spam中的名字直接导入到当前的名称空间中, 在当前名称空间中,直接使用名字就可以了
(注意啊,from 后面紧接只能包名,然后import名字不能有点啊,只能是名字 (当前有重名getMoney或者getFunc,那么会有覆盖效果)
支持别名:from spam import getMoney as gm from spam import * 把spam中所有的不是以下划线(_)开头的名字都导入到当前位置, 大部分情况下我们的python
程序不应该使用这种导入方式,因为*你不知道你导入什么名字, 很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题 # """
1 #spam.py
2 print('from module spam')3 money = 1000
4 y = 100
5 defgetMoney():6 print('get-->spam -->getmoney')7 print(money)8 defgetFunc():9 getMoney()10 defchange():11 print('get->spam-->change')12 globalmoney13 money =014 print("当前money :%s"%money)15 #可以使用__all__来控制*(用来发布新版本)
16 __all__= ['getMoney','money','y']17 #这样在另外一个文件中用from spam import *就这只能导入列表中规定的两个名字而不是全部
#testspam.py如下 :
1 importspam2 money = 1118
3 spam.getMoney()4 spam.getFunc()5 spam.change()
输出结果
from module spam
get-->spam -->getmoney
1000
get-->spam -->getmoney
1000
get->spam-->change
当前money :0
练习:
要求一:保证包keystone可以在任意位置被导入
要求二:import keystone,然后就可以直接调用keystone.create和keystone.UserAuthInfo
1 创建如下目录结构2 keystone/
3 ├── __init__.py4 └── auth5 ├── __init__.py6 └── plugins7 └── core.py8
9 core.py内容为:
1 defcreate(cls, auth_payload, method_name):2 pass
3 classUserAuthInfo:4 def __init__(self):5 self.password =None6 print('hello i core--->userauthinfo--->init')
文件目录结构:
1 #plugins/__init__.py
2 from . importcore3 print('auth-->plugins-->init')
1 #keystone/__init__.py
2 from .auth.plugins.core importcreate3 from .auth.plugins.core import UserAuthInfo
1 #auth/__init__.py
2 from . import plugins
下面来测试:
1 importos,sys2 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))3 print(base_dir)4 sys.path.append(base_dir)5 #from aaaaa import keystone
6 importkeystone7 keystone.create(keystone.UserAuthInfo,'gi','ddd')8 keystone.UserAuthInfo()
结果:
auth-->plugins-->init
hello i core--->userauthinfo--->init
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如何基于移动方式绑定:
1 importos,sys
2 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
3 #添加包的查找路径
4 sys.path.append(base_dir)
5 from aaaaa import keystone #从新路么下引入这个包
6 #import keystone
7 keystone.create(keystone.UserAuthInfo,'gi','ddd')
8 keystone.UserAuthInfo()
注意:其实只要知道__init__.py巧用,不管模块藏哪,都可以找到那个对应模块。