zoukankan      html  css  js  c++  java
  • python 模块与包

    包:是一种通过使用‘.模块名’来组织python模块名称空间的方式。

    1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法

    2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)

    3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

    强调:

      1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错

      2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块。

    import os
    os.makedirs('glance/api')                  #在galnce文件创建api
    os.makedirs('glance/cmd')                 #在galnce文件创建cmd
    os.makedirs('glance/db')                   #在galnce文件创建db
    l = []
    l.append(open('glance/__init__.py','w'))       #下列都是创建py文件操作方式       
    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 version.py: ',conf)
    
    #manage.py
    def main():
        print('from manage.py')
    
    #models.py
    def register_models(engine):
        print('from models.py: ',engine)

    1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。

    2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

    3.对比import item 和from item import name的应用场景:
    如果我们想直接使用name那必须使用后者。  

    __init__.py:

         不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。

    #在__init__.py中定义
    x=10
    
    def func():
        print('from api.__init.py')
    
    __all__=['x','func','policy']
    
    #从一个模块内导入所有*,此处我们研究从一个包导入所有*。
    #此处是想从包api中导入所有,实际上该语句只会导入包api下__init__.py文件中定义的名字,我们可以在这个文件中定义__all___

     绝对导入和相对导入

    绝对导入:以glance作为起始

    相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)

    glance/api/version.py
    
    #绝对导入
    from glance.cmd import manage
    manage.main()
    
    #相对导入
    from ..cmd import manage
    manage.main()

    可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from... import ...的绝对或者相对导入,且包的相对导入只能用from的形式。

    软件开发规范

    '''
    需要一个文件夹
        程序入口
        配置文件
        核心代码
        数据库
        自己写的通用模块或者包
        日志
    '''

    异常处理

    '''
    程序一旦发生错误,就从错误的位置停下来了,不在继续执行后面的内容
    使用try和except就能处理异常
        try是我们需要处理的代码
        except 后面跟一个错误类型 当代码发生错误且错误类型符合的时候 就会执行except中的代码
        except支持多分支
        有没有一个能处理所有错误的类型 : Exception
             有了万能的处理机制仍然需要把能预测到的问题单独处理
             单独处理的所有内容都应该写在万能异常之前
        else : 没有异常的时候执行else中的代码
         finally : 不管代码是否异常,都会执行
             finally和return相遇的时候 依然会执行
             函数里做异常处理用,不管是否异常去做一些收尾工作
    '''
    try:
         print()
    except 错误类型:
         pass
    
    
    try:
         print()
    except Exception  as 变量:
         print('',变量)
  • 相关阅读:
    POJ 1703 Find them, Catch them
    POJ 2236 Wireless Network
    POJ 2010 Moo University
    POJ 2184 Cow Exhibition
    POJ 3280 Cheapest Palindrome
    POJ 3009 Curling 2.0
    POJ 3669 Meteor Shower
    POJ 2718 Smallest Difference
    POJ 3187 Backward Digit Sums
    POJ 3050 Hopscotch
  • 原文地址:https://www.cnblogs.com/soleZ/p/8276925.html
Copyright © 2011-2022 走看看