zoukankan      html  css  js  c++  java
  • 24-25模块和包

    模块和包
    1. 认识模块
    模块可以认为是一个py文件. 模块实际上是我们的py文件运行后的名称空间
    导入模块:
    1. 判断sys.modules中是否已经导入过该模块
    2. 开辟一个内存
    3. 在这个内存中执行该py文件
    4. 给这个内存起个名字, 一般用的是py文件的名字。返回给导入方
    如果你的py文件是启动文件, 名字是__main__

    程序的入口一般是:
    if __name__ == "__main__":
    pass
    2. import
    import 模块名
    模块名.属性/方法/类

    每个模块都有自己的独立的名称空间,每个都有一个global, 互相并不影响
    模块.属性 = 值. # 不要这么干

    3. from xxx import xxx
    from 模块 import 函数/变量
    当作自己的变量或者函数来使用

    from xxx import * 导入所有 在模块中用 __all__=[限定*可用的变量和方法]
    导入的内容都可以起别名 as

    二.包
    1. 包
    包就是一个文件夹. py2中包内必须要有一个__init__.py文件, 在python3中可以省略,但是最好都保留.
    __init__.py 当我们导入一个包的时候,默认执行这个包内的__init__.py

    python中程序单位
    一条语句 > 语句块 > 代码块(函数,类) > py文件(模块) > 包
    2. 相对导入和绝对导入
    相对导入: 相对于当前模块所在的包. 使用的时候必须在包外面启动
    绝对导入: 根据包的根目录去导入内容

    全部都依赖于 sys.path

    3. 使用包要注意的东西

    尽量在包的外面启动程序.

    三.构建glance包程序
    import os
    os.makedirs('glance/api')
    os.makedirs('glance/cmd')
    os.makedirs('glance/db')
    l = []
    l.append(open('glance/__init__.py','w'))
    l.append(open('glance/api/__init__.py','w'))
    l.append(open('glance/api/policy.py','w'))
    l.append(open('glance/api/versions.py','w'))
    l.append(open('glance/cmd/__init__.py','w'))
    l.append(open('glance/cmd/manage.py','w'))
    l.append(open('glance/db/__init__.py','w'))
    l.append(open('glance/db/models.py','w'))
    map(lambda f:f.close() ,l) 

    1.policy.py文件中:

    #policy.py
    
    # from glance.cmd import manage  #绝对路径
    def get():
        manage.main()
        print('from policy.py')
    
    # get()   会报错, 因为此处的sys.path 为api  不能在sys.path 中找到glance
    
    
    #相对路径 ..上层文件夹   . 当前文件夹
    #相对路径只能在包外启动
    # from . import versions  #让glance同级目录下的test2 访问policy当前文件时,执行versions中的create_resource 方法
    # versions.create_resource("你好啊")
    
    # from ..cmd import manage  # #让glance 同级目录下的test2 访问policy当前文件时,执行cmd 下的manage中的main方法
    # manage.main()

    2.versions.py文件中

    #versions.py
    def create_resource(conf):
        print('from version.py: ',conf)

    3.manage.py

    #manage.py
    def main():
        print('from manage.py')

    4.models.py

    #models.py
    def register_models(engine):
        print('from models.py: ',engine)
  • 相关阅读:
    autocomplete自动完成搜索提示仿google提示效果
    实现子元素相对于父元素左右居中
    javascript 事件知识集锦
    让 IE9 以下的浏览器支持 Media Queries
    「2013124」Cadence ic5141 installation on CentOS 5.5 x86_64 (limited to personal use)
    「2013420」SciPy, Numerical Python, matplotlib, Enthought Canopy Express
    「2013324」ClipSync, Youdao Note, GNote
    「2013124」XDMCP Configuration for Remote Access to Linux Desktop
    「2013115」Pomodoro, Convert Multiple CD ISO to One DVD ISO HowTo.
    「2013123」CentOS 5.5 x86_64 Installation and Configuration (for Univ. Labs)
  • 原文地址:https://www.cnblogs.com/knighterrant/p/9988642.html
Copyright © 2011-2022 走看看