zoukankan      html  css  js  c++  java
  • python3 package management 包管理 实例

    包是一种组织管理代码的方式,包里面存放的是模块

    用于将模块包含在一起的文件夹就是包

    包内包含__init__.py标志性文件

    定义一个学生类,一个sayhello函数,一个打印语句

    # p01.py
    class Student():
    
        def __init__(self, name="NoName", age=18):
            self.name = name
            self.age = age
    
        def say(self):
            print("My name is {}".format(self.name))
    
    
    def sayhello():
        print("Hi,你好")
    
    
    print("我是模块p01")

    一、定义一个Student类,因p01已定义好,所以直接调用

    import p01
    
    a = p01.Student("hh",19)
    
    a.say()
    
    p01.sayhello()
    #此段代码会先执行p01中的print,因为导入模块,就相当于把p01整段代码都导入进来,执行的时候会全部执行一遍

    二、导入名字以数字开头的包

    #01.py,以数字开头的模块
    class Student():
    
        def __init__(self, name="NoName", age=18):
            self.name = name
            self.age = age
    
        def say(self):
            print("My name is {}".format(self.name))
    
    
    def sayhello():
        print("Hi,你好")
    
    
    print("我是模块p01")
    # import 01
    # 基于python变量的命名规则,不能以数字开头
    # 借助于importlib包可以实现导入以数字开头的模块名称
    import importlib
    
    A = importlib.import_module("01")
    a = A.Student()
    a.say()

    三、导入p01模块,并重新命名为 p

    import p01 as p
    
    a = p.Student("hh",18)
    a.say()

    四、只想用Studen类,别的不想要

    from p01 import Student
    #有选择性的导入
    #使用时候不需要模块名称的前缀
    
    a = Student("hh", 20)
    a.say()

    五、针对四导入Studen类,为何还会执行print

    # p01.py,修改p01代码
    class Student():
    
        def __init__(self, name="NoName", age=18):
            self.name = name
            self.age = age
    
        def say(self):
            print("My name is {}".format(self.name))
    
    
    def sayhello():
        print("Hi,你好")
    
    # 可以有效避免代码被导入的时候被动执行的问题
    # 建议所有程序的入口都以此代码为入口
    if __name__ == "__main__":
        print("我是模块p01")

    六、导入包下的所有

    # 导入p01模块下的所有
    from p01 import *
    # 不需要前缀有个坏处,名称太多容易引起混乱
    
    sayhello()
    
    a = Student("hh", 19)
    a.say()

    七、查看所有的包的路径 及 添加路径

    import sys
    
    print(type(sys.path))
    # 获取路径列表
    # 查看包的路径,以方便使用时候的调用
    print(sys.path)
    for i in sys.path:
        print(i)
    
    # 添加路径
    # sys.path.append(dir)

    以下内容举例描述不便,文字描述一下

    包内模块调用与模块同级的包用法

    语法:import package_name.module

       导入包中某一个具体的模块

    使用方法:

       package_name.module.func_name

       package_name.module.class.func()

       package_name.module.class.var

       跟上述用法都差不多

    语法 :from package import module1,module2, ......

       此种导入方法不执行 '__init__'的内容

    使用方法:

       from package import module

       module.dunc()

    语法:from package import * 

       导入当前包 '__init__.py' 文件中的所有函数

    使用方法:

       func_name()

       class_name.func_name()

       class_name.var

    语法: from package.module import *

       导入包中指定模块的所有内容

    使用方法:

       func_name()

       class_name.func_name()

    经常使用其他路径下的包,可以在当前包中直接导入

    import 完整包或者模块的路径

     '__all__'的用法,具体百度了解下

    在使用from package import * 的时候, *可以导入的内容

    '__init__.py' 中如果文件为空, 或者 没有 '__all__',那么可以把 '__init__.py' 中的内容导入进去

    '__init__.py' 如果设置了  '__all__' 的值 ,那么按照  '__all__' 指定的子包或者 模块进行导入

    如何则不会载入 '__init__.py' 中的全部内容

     '__all__' = ['module', 'module1', 'module2', ......]

  • 相关阅读:
    用jQuery的offset()替代javascript的offset
    java实现SAP BO登录
    原生js实现模块来回拖拽效果
    HTML中marquee标签的使用
    axure 预览"HTTP/1.1 302 Found"
    redis命令详解
    idea找不到package下的mapper.xml文件
    confluence搭建详情
    httpClient解决post请求重定向的问题
    java double相加
  • 原文地址:https://www.cnblogs.com/vaster/p/9884115.html
Copyright © 2011-2022 走看看