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

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

day21 02 包的进阶的更多相关文章

  1. ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation

    ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ...

  2. 02:Django进阶篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  3. day21 01 包的初识

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

  4. Net包管理NuGet(4)打包nuget包的进阶用法

    nuget包不止可以放进dll,还可以引用其他包,创建项目文件及替换配置文件 引用的时候同时引用依赖项假设引用某个dll需要依赖其他的dll如Zeta.Core.dll需要引用ZETA.Seriali ...

  5. 原来你是这样的JAVA[02]-包、传参、构造器

    一.包(package) 在java程序中,一个java源文件称为编译单元,以.java后缀命名.编译单元内可以有一个public类,类名必须与文件名相同.注意:每个编译单元只能有一个public类. ...

  6. Java流程控制02:Scanner进阶

    Scanner进阶使用 import java.util.Scanner;​public class Demo04 {    public static void main(String[] args ...

  7. 02.vue-router的进阶使用

    关键字:路由懒加载,全局导航守卫,组件导航守卫,redirect重定向,keep-alive,params,query 一.目录结构            二.index.js // 配置路由相关的信 ...

  8. day21:包和异常处理

    1,复习 # 序列化模块 # json # dumps # loads # dump 和文件有关 # load load不能load多次 # pickle # 方法和json的一样 # dump和lo ...

  9. Linux 基础命令 命令进阶

    Linux命令格式:命令 选项 参数 (大部分命令是这个格式) 注意: 1.命令区分大小写 2.短选项可以合并   长选项不能合并 如 : 短选项 -l  -h 可以合并为 -lh 长选项  不能合并 ...

随机推荐

  1. 洛谷 P2038 无线网络发射器选址 —— 二维树状数组

    题目:https://www.luogu.org/problemnew/show/P2038 大水题暴露出我的愚蠢. 用二维树状数组,然而居然忘了它应该那样写,调了一个小时: 正方形可以超出外面,只要 ...

  2. 05_锅炉压力案例_java实现

    最开始是有机顶盒,后来电视里面都带着一个安卓的设备.现在空调.冰箱.洗衣机都跃跃欲试地想把这个东西加上.海尔出了一款智能冰箱,就是在冰箱门上嵌了一个12寸的屏幕.这个屏幕实际上就是一个安卓的平板似的. ...

  3. Java源码——Integer

    最近在研究java的源代码,但是由于自己英语水平有限,所以想使用中文注释的方式把源码里的方法全部重写 一遍,下面是楼主整理出来的一小部分.我把整体的项目托管到GitHub上了,欢迎大家前去交流学习. ...

  4. PCB Genesis加邮票孔(弧与弧)实现算法

    一.Genesis加邮票孔(弧与弧)实现算法 1.鼠标点击位置P点(可以确认搜索区域位置,确认点击位置周边元素分区,此所讲算法未应用到P点坐标) 2.求出:P1C与P2C (线与弧最近点距离的2个点) ...

  5. bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路【最小生成树】

    先把已有的边并查集了,然后MST即可 记得开double #include<iostream> #include<cstdio> #include<algorithm&g ...

  6. $CF19A\ World\ Football\ Cup$

    炒鸡\(6\)批的模拟题. 注意的是输入 把握好空格 大小写. 根据题目的这句话来排序 积分榜是按照以下原则制作的:胜利一个队得3分,平分1分,失败0分. 首先,球队按积分顺序排在积分榜上,分数相等比 ...

  7. 同余模定理 HDOJ 5373 The shortest problem

    题目传送门 /* 题意:题目讲的很清楚:When n=123 and t=3 then we can get 123->1236->123612->12361215.要求t次操作后, ...

  8. 用 jQuery 实现简单倒计时功能

    问题场景:假设某个活动截止时间给定了,现在需要开发一个页面可以自动刷新距离活动截止时间还剩多少天? <!DOCTYPE html> <html xmlns="http:// ...

  9. JAVAEE 是什么,如何获取各种规范jar包及各种规范的jar包源码

    1.什么是JAVA EE JAVA EE是由一系列规范组成的,规范是由JCP制定的,并且提供了参考实现.规范(Specification)是一系列接口,不包含具体实现 有以下常见的JAVA EE实现, ...

  10. 发生在升级OS X Yosemite后:修复各种开发环境

    本博文最初发布于我的个人博客<Jerry的乐园> 终于还是忍不住升级了,促使我升级的原动力居然是Alfred的Yosemite theme居然比初始theme好看很多!在升级前就预想到我的 ...