• python模块


    1、python代码的目录就称为包,因此这类倒入就称为包导入。事实上,包倒入是把计算机的目录变成另一个python命名空间,而属性则对应目录中所包含的所有子目录和模块文件。
    
    2、用法
    
                    import dir1.dir2.mod
    
                    其中dir1的顶层目录必须在搜索路径下,也就是说在sys.path里面。还有就是dir1和dir2目录下必须有__init__.py这个文件
    
    3、包的相对倒入
    
                    from . import spam   #告诉python把位于语句中的文件相同包路径中的名为spam的一个模板导入。
    
                    from .spam import name #从名为spam的模板导入变量name,而整个spam模板与包含这条语句的文件位于同一个包下
    
    4、相对导入只针对from有用,对from没用
    
    5、如果mypkg下面有name1,name2模块
    
                    from .string import name1,name2  #从mypkg下面的string下面导入name1,name2
    
                    from . import string  #从mypkg导入string
    
                    from .. import string  #从mypkg兄弟目录下倒入string
    
    6、例子
    
                    位于摩格模块A.B.C中的代码可以做下面任何一种导入
    
                    from . import D   #import A.B.D
    
                    from .. import E                #import A.E
    
                    from .D import X              #import A.B.D.X
    
                    from ..E import X              #import A.E.X
    
    #高级模块话题
    
    1、把一个下划线放在变量名前(例如:_x),可以防止客户端使from * 语句导入模块名时把其中那些变量复制出去。
    
                    __all__可以在模块顶层把变量名的字符串列表赋值给 __all__
    
    2、启用以后的语言特性
    
                    from __future__ import featurename
    
    3、混合用法模式:__name__和__main__
    
                    如果文件是以顶层程序文件执行的,在启动时,__name__就会设置为字符串 __main__
    
                    如果文件被导入,__name__就会改设成客户端所了解的模块名
    
    4、import语句和from语句的as扩展
    
                    import modulename as name
    
                    相当于
    
                    import modulename
    
                    name = modulename
    
                    del modulename
    
                   
    
                    from modulename import attrname as name
    
    5、因为模块通过 内置属性显示了他们大多数有趣的特性,因此可以很容易的编写 程序来管理其他程序。这类管理程序称为元程序。因为他们是在其他系统 之上工作。这也成为内省。
    
                    例如:要取得模块M 中的属性name的集中方法
    
                    M.name   #点号运算
    
                    M.__dict__['name']#对模块的属性字典(在内置__dict__属性中)
    
                    sys.modules['M'].name #sys.modules中存在已经加载的模板列表
    
                    getattr('M','name')  #内置函数getattr
    
                    #下面模拟内置函数dir
    
                    def mydir(module,verbose=True):
    
                                    sepline = '-'*60
    
                                    if verbose:
    
                                                    print(sepline)
    
                                                    print('name:',module.__name__,' file:',module.__file__)
    
                                                    print(sepline)
    
                                    count = 0
    
                                    for attr in module.__dict__:
    
                                                    print('%02d) %s'%(count,attr),end=' ')
    
                                                    if attr.startwith('__'):
    
                                                                    print('<built-in name>')
    
                                                    else
    
                                                                    print(getattr(module,attr))
    
                                                    count+=1
    
                                    if verbose :
    
                                                    print(sepline)
    
                                                    print(module.__name__,'has %d names' %count)
    
                                                    print(sepline)
    
    6、如果想动态的改变导入模块,则必须通过exec或者eval函数
    
                    modname = 'string'
    
                    exec('import '+modname)
    
                    exec函数编译一个代码字符串,并且将其传递给python解释器以执行。
    
                    exec一个真正的缺点是,每次运行时都必须编译 import语句,如果他运行多次,则可以使用内置 __import__函数从一个名称字符串导入,代码可能运行速度更快,效果是类似的。但是__import__运行模块对象,所有这里先赋值给一个名称以保存
    
                    modename = 'string'
    
                    string = __import__(modename)
    
    7、过渡性模块重载
    
                    例如:
    
                    如果要 重载摩格模块A,并且A 导入模板B C ,重载只适用于A ,不适用于B 和C,A中导入的B和C的语句 在重载的时候重新运行了 。但是他们只是获得已经重载 B 和C
    
                    过渡性重载工具
    
                    import types
    
                    from imp import reload
    
                    def status(module):
    
                                    print("reloading:",module.__name__)
    
                                   
    
                    def transitive_reload(module,visited):
    
                                    if not module in  visited:
    
                                                    status(module)
    
                                                    reload(module)
    
                                                    visited[module] = None
    
                                                    for attrobj in module.__dict__.values():
    
                                                                    if type(attrobj) ==types.ModuleType:
    
                                                                                    transitive_reload(attrobj,visited)
    
                   
    
                    def reloadall(*args):
    
                                    visited = {}
    
                                    for arg in args:
    
                                                    if type(arg) == types.ModuleType:
    
                                                                    transitive_reload(arg,visited)
    

      

  • 相关阅读:
    qt 数据库操作总结
    Pro*C编程研究一:从.pc到.exe
    通过OCCI连接oracle(C++)
    数据库操作通用类
    一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER
    如何卸载oracle11g
    ORA-12541:TNS:无监听程序
    Qt 线程基础(QThread、QtConcurrent等) 2
    QThreadPool类和QtConcurrent命名空间
    AE 向已存在的要素类中添加字段
  • 原文地址:https://www.cnblogs.com/hbcb533/p/3687531.html
Copyright © 2020-2023  润新知