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文件:日志,记录一些执行结果,待后面去查询

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

  • 相关阅读:
    PHP 使用 GET 传递数组变量
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
  • 原文地址:https://www.cnblogs.com/wxm422562/p/10809709.html
Copyright © 2011-2022 走看看