zoukankan      html  css  js  c++  java
  • day21 02 包的进阶

    day21 02 包的进阶

    1._init_.py文件的操作---导入包

           根据day21 01 包的初识,建立的glance包,直接import glance后通过“包点包。。点方法”是不能执行所要的方法的,必须通过在一层一层里面的_init_.py或者其他类似的文件做相对应的导入操作,才可以运行以下代码而不会报错:

    import glance
    glance.api.policy.get()

    2.绝对路径导入

    将建立的glance包放入新建的dir文件夹中,然后执行代码:

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

    看着这代码似乎合情合理,但是运行结果会报错,为什么呢?这和前面所说的路径问题有关:

           当你运行 from dir import glance的时候,通过sys.path可以知道,会把你当前运行所在的页面的路径保存到sys.path的第一个,比如你当前的界面的路径是'C:\Users\sku1-1\PycharmProjects\untitled,但是在此目录下并没有找到glance这个包,以至于glance里面的init文件也不会执行,后面就会报错,而要想不会报错就需要通过确切的路径去执行:

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

    这样确切的路径就称为绝对路径,绝对路径的

    优点:比较直观,不管是在内部还是外部,导入就能使用

    缺点:就是包不能挪动,一挪动就会出错

    3.相对路径导入(一般在自己可以完全制作一个完整的包的时候再使用)

    一个点:代表当前目录

    两个点:代表上一层目录

    在glance包下面的_init_.py文件夹中输入:

    from . import api
    from . import cmd
    from . import db

    就是从当前文件夹中导入api,cmd,db,同时在api,cmd包下的_init_.py文件输入:

    from . import policy
    from . import versions
    from . import manage

    然后在运行界面执行:

    import glance
    glance.api.policy.get()

    就可以使用policy方法了

    如果将glance放入dir文件中,执行:

    from dir import glance
    glance.cmd.manage.get()

    同样可以使用cmd里面的方法,这种使用当前目录导入包的方法

    优点:可以随意移动包,只要能找到包的位置,就可以使用包里面的方法

    缺点:不能在包里使用这个模块了,比如包下面文件与文件之间的函数的相互调用,只能使用相对路径,使用了相对路径就不能在内部直接执行了

    比如:在policy模块里面使用cmd模块的方法:

    def get():
        print('from policy.py')
    from dir import glance
    glance.cmd.manage.main()

    此时运行结果将会报错:只要使用了相对路径导入包,包里面所有使用相对路径去使用的都是会报错的,但是在包外面是可以随意使用的

    4.from 包 import * 和_all_相对导入

    在glance包里面的_init_.py文件添加内容:

    from .api import *
    from .cmd import *
    from .db import *

    在api,cmd,db里面的_init_.py文件分别写入:

    _all_=['policy','versions']
    _all_=['manage']
    _all_=['models']

    这样就可以把api,cmd,db里面所有的方法都执行了,后面要调用policy,直接

    import glance
    policy.get()

    就可以调用policy方法了,但是把api,cmd,db隔离开,相当于都没有它们名字本身什么事了,这种方法其实也是使用相对路径,也就存在相对路径的优缺点

    对于初学者来说:要一定会使用绝对导入,而了解相对导入

    5.使用python编程软件开发的一些规范

    (1)bin文件:程序入口,文件里面有个start.py,一般里面放的内容基本是固定

    (2)core文件:软件核心代码

       假如这两个文件里面含有:

    bin文件里面
        init_.py
        start.py
    core文件里面
        _init_.py
        core.py文件里面
              def main:
    print('main')
    login.py文件里面:
    def login:
    print('login')

    此时要想在core.py文件里面调用login(),如何实现呢?

    首先在bin文件里面的start.py里面写入:

    import os
    import sys
    sys.path.append(os.path.dirname(os.getcwd()))
    #os.getcwd()获取次页面所在的目录,即bin的目录
    # os.path.dirname(os.getcwd())#获取bin所在的目录,即当前页面所在的上层目录,而bin所在的目录还包含了core文件
    #sys.path.append(os.path.dirname(os.getcwd()))将获取到的上层目录添加到os.path中
    # 这样当在此页面开始执行的时候bin和core文件里面的都可以找得到,所以可以直接导入bin和core里面的方法调用函数
    from core import core#从core里面导入core模块,并执行
    if _name_=='_main_':#在此页面执行的时候,就执行以下代码
        core.main()#调用core里面的main函数

    由于添加了上层目录的问题,可以直接在core.py里面导入login模块,然后直接调用login模块里面的login函数:

    from core import login#从core里面导入login模块
    def main():
        print('main')
        login.login()#已经导入login模块了,可以直接调用函数了

    运行start.py页面,结果:

    main
    login

    (3)conf文件:配置文件,放置一些任何人都可以看得懂的东西:一般给运维人员看的,一般他们不懂代码,但是他们可以通过调参数,改变代码

    (4)db文件:数据库,比如登入认证的的数据

    (5)lib文件:自己写的通用模块或包,完整模块,不需要安装

    (6)log文件:日志,记录一些执行结果,待后面去查询

       现在只是大概有一个思路,好多都还不会,后面会讲到

  • 相关阅读:
    oracle11g静默安装
    pv vg lv
    oracle日志表
    oracle常用sql
    vulnhub~muzzybox
    vulnhub~sunset:dusk1
    vulnhub~MyExpense
    vulnhub~DC-9
    汇编学习一
    贪心算法和动态规划
  • 原文地址:https://www.cnblogs.com/wxm422562/p/10809709.html
Copyright © 2011-2022 走看看