• python 模块与包的引用及移动绑定


    """ 注意只要是调用模块,就是创建新名称空间,并在此新的名称空间下执行原模块文件里定义的所有代码 
    多模块导入,可以逗号来分 (import re,sys )

    可以为模块定义别名咯 import spam as pi ,调用时就用pi.名字

    1.为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间。

    2.在新创建的命名空间中执行模块中包含的代码

    3.创建名字spam来引用该命名空间

    4 事实上函数定义也是“被执行”的语句,模块级别函数定义的执行将函数名放入模块全局名称空间表,用globals()可以查看
    print(globals())

    '__name__': '__main__', '__cached__': None, 'getMoney': <function getMoney at 0x00000000007D0268>,
    'getFunc': <function getFunc at 0x00000000007D01E0>, '__builtins__': <module 'builtins' (built-in)>,
    'money': 1000, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000044C3C8>}
    模块调用

    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 def getMoney():
     6     print('get-->spam -->getmoney')
     7     print(money)
     8 def getFunc():
     9     getMoney()
    10 def change():
    11     print('get->spam-->change')
    12     global  money
    13     money = 0
    14     print("当前money :%s"%money)
    15 #可以使用__all__来控制*(用来发布新版本)
    16 __all__= ['getMoney','money','y']
    17 #这样在另外一个文件中用from spam import *就这只能导入列表中规定的两个名字而不是全部
    #testspam.py如下 : 
    1 import spam
    2 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__.py
     4 └── auth
     5     ├── __init__.py
     6     └── plugins
     7         └── core.py
     8 
     9 core.py内容为:
    1 def create(cls, auth_payload, method_name):
    2     pass
    3 class UserAuthInfo:
    4     def __init__(self):
    5         self.password = None
    6         print('hello i core--->userauthinfo--->init')
    
    
    
    
    

    文件目录结构:

    1 #plugins/__init__.py
    2 from . import core
    3 print('auth-->plugins-->init')
    1 #keystone/__init__.py
    2 from .auth.plugins.core import create
    3 from .auth.plugins.core import UserAuthInfo
    1 #auth/__init__.py
    2 from . import  plugins

    下面来测试:

    1 import os,sys
    2 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 import keystone
    7 keystone.create(keystone.UserAuthInfo,'gi','ddd')
    8 keystone.UserAuthInfo()

    结果:

    auth-->plugins-->init
    hello i core--->userauthinfo--->init

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    如何基于移动方式绑定:

    1 import os,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巧用,不管模块藏哪,都可以找到那个对应模块。

  • 相关阅读:
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    POJ 3162 Walking Race (树的直径,单调队列)
    POJ 2152 Fire (树形DP,经典)
    POJ 1741 Tree (树的分治,树的重心)
    POJ 1655 Balancing Act (树的重心,常规)
    HDU 2196 Computer (树形DP)
    HDU 1520 Anniversary party (树形DP,入门)
    寒门子弟
    JQuery选择器(转)
    (四)Web应用开发---系统架构图
  • 原文地址:https://www.cnblogs.com/hongyongshang/p/6799951.html
Copyright © 2020-2023  润新知