• day21 01 包的初识


    day21 01包的初识

           包:把解决一类问题的模块放在同一个文件夹里面-----包(一个包里面通常会含有_init_.py文件(python2里面必须有),但是后面的就没有要求一定要有了)

           同样导入的时候有import和 from  import 两种

           注意:凡是导入是带点的,点的左边必须是一个包模块,对于from import类型的来说,import后面不能带有点,(from glance import policy.api是错误会报错)

           在pcharm的project里面建立了一个glance包,而glance包里面又有api,cmd,db包还有一个_init_.py文件,再在api包里面又有一个policy.py和_versions_.py文件,

    cmd里面有一个_init_.py和manage.py文件,而db包里面有一个models.py文件,要想生成这些文件,可执行以下代码:

    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/models.py','w')) #打开七个文件,同时生成文件句柄,把这七个文件句柄放到列表中
    map(lambda f:f.close(),l) #拿到列表里面每一个文件句柄,并进行关闭

    各个生成的文件里面的内容:

    policy.py

    def get():
        print('from policy.py')

    versions.py

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

    manage.py

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

    models.py

    def register_models(endine):
        print('from models.py: ',engine)

    生成一个glance包后,我们就可以执行导入的操作了:

    (1)直接import+包点包点.....点方法,然后 print(包点包点.....点方法点get())就可以看到是否导入了

    import glance.api.policy as policy
    policy.get()

    运行结果:

    from policy.py
    

    (2)from 包点包点......点包 import  方法(这种方法需要注意import后面不能带点)

    from glance.api import policy
    policy.get()

    运行结果:

    from policy.py

    如果此时在project下面还有glance外面再建一个dir文件夹,此时要import glance就找不到了,因为:

    导入的时候是根据以下路径导入的,当将glance放到dir下面的时候,只找到了前面两个而且都是'C:\Users\sku1-1\PycharmProjects\untitled',后面就与它无关了,

    而glance在dir里面,dir在它的里面,后面没有说明就找不到了。

    import sys
    print(sys.path)

    运行结果:

    ['C:\Users\sku1-1\PycharmProjects\untitled', 'C:\Users\sku1-1\PycharmProjects\untitled', 'C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python35.zip', 'C:\Users\sku1-1\AppData\Local\Programs\Python\Python35\DLLs', 'C:\Users\sku1-1\AppData\Local\Programs\Python\Python35\lib', 'C:\Users\sku1-1\AppData\Local\Programs\Python\Python35', 'C:\Users\sku1-1\PycharmProjects\untitled\venv', 'C:\Users\sku1-1\PycharmProjects\untitled\venv\lib\site-packages', 'C:\Users\sku1-1\PycharmProjects\untitled\venv\lib\site-packages\setuptools-39.1.0-py3.5.egg', 'C:\Users\sku1-1\PycharmProjects\untitled\venv\lib\site-packages\pip-10.0.1-py3.5.egg', 'C:\Program Files\JetBrains\PyCharm 2018.2.2\helpers\pycharm_matplotlib_backend']

    要想找到glance,只能通过:

    from dir.glance.api import policy
    policy.get()

    或者先添加一个路径给它:

    sys.path.insert(0,'C:\Users\sku1-1\PycharmProjects\untitled\dir')#在第一个路径插入,这里多了一个dir
    from glance.api import policy
    policy.get()

    运行结果:

    from policy.py

    如果按照以下代码执行导入:

    import glance
    glance.api.policy.get()#找不着

    是会报错的,运行结果:

    Traceback (most recent call last):
      File "<encoding error>", line 23, in <module>
    AttributeError: module 'glance' has no attribute 'api'

    为什么呢?

            平时我们导入一个模块,就会执行这个模块,但是导入一个包,它不会执行里面的方法,而是默认执行它里面的_init_.py文件,可以在_init_.py文件里面放一些内容,

    并执行 import glance就可以验证了

            由于每次导入一个包都会执行它的init文件,所以可以在_init_.py里面进行操作,所以先在dir下的_init_.py文件里面导入:

    from glance import api
    from glance import cmd
    from glance import db

    而此时也还是导入了一个 api,cmd,db包,还是不会执行api里面的policy方法,同样跟上面一样,继续在glance包里面的_init_.py文件导入policy:

    from glance.api import policy

    此时我们就可以执行以下代码,而不会报错了

    import glance
    glance.api.policy.get()

    运行结果:

    from policy.py
  • 相关阅读:
    python3 操作excel(读操作)
    display:inline-block;产生间隙解决方法
    vedio自定义样式
    angularjs路由
    移动端设置字体px转换rem的脚本
    div在不固定高度的情况下垂直或者水平居中
    css气泡地址和分享地址
    js点击按钮div显示,点击div或者body和按钮,div隐藏
    js倒计时跳转页面
    点击按钮div显示,点击div或者document,div隐藏
  • 原文地址:https://www.cnblogs.com/wxm422562/p/10803550.html
Copyright © 2020-2023  润新知