python-模块和包-19

#1、模块
- 一个模块就是一个包含python代码的文件,后缀名是.py
- 为什么用模块
-程序太大,编写维护不方便,需要拆分
-模块可以增加代码重复利用的效率
-当做命名空间使用,避免命名冲突

-如何定义模块
-模块就是一个普通的文件,跟正常写代码的操作是一样的
-但是模块有编写规范,要包含以下内容
-函数(单一功能)
-类(相似功能的组合)
-测试代码

-如何使用模块
-直接导入(模块名尽量不要以数字开头)
import module_name
mudule_name.function_name
module_name.class_name
或者
import 模块 as 别名
-导入的同时给模块起一个别名
-其他操作跟上面相同

#例
#我们先写一段代码,放进一个名为p01.py的文件

class Student():
    def __init__(self,name = "siqi",age = 19):
        self.name = name
        self.age = age
        
    def say(self):
        print("my name is {0}".format(slef.name))
    
def sayhello():
    print("you are stupid")
    

#然后,我们在另一个python文件p02.py中想调用这个模块
import p01
stu = p01.Student("siqi",20)
stu.say()
p01.sayhello()    

#如果模块名是数字开头,假设模块名是01,需要借用importlib来实现
import importlib
LL = importlib.import_module("01")
stu = LL.Student()
stu.say

#如果想用模块中的其中一个功能,即选择性导入,运用时不用带模块名
form p01 import Stuent
stu = Student()
stu.say()

#下面方法也是导入模块所有内容,导入后也可以不用带模块名
from p01 import *
stu = Student()
stu.say()

#if__name__=="__main__"的使用
-可以有效避免模块代码被导入的时候被动执行的问题

#2、模块的搜索路径和储存
-什么是模块的搜索路径:
-加载模块的时候,系统会在哪里寻找此模块
-系统默认的模块搜索路径
import sys
sys.path 属性可以获取路径列表
#案例p06.py
import sys
print(sys.path)
-添加搜索路径
sys.path.append(dir)

-模块的加载顺序
-1、内存中已经加载好的模块
-2、搜索python的内置模块
-3、搜索sys.path路径

#3、包
-包是一种管理代码的包裹,包里存放的是模块
-简单理解,包就是文件夹,模块就是.py文件
-自定义包的结构
-包的导入操作

- import package_name
        -直接导入一个包,可以使用__init__.py中的内容
        -使用方式:
            package_name.func_name
            package_name.class_name.func_name()
        -此种方式的访问内容是:
        -案例pkg01(此文件中创建了名为__init_.py的文件)
        def ininit():#此函数定义在__init__.py中
            print(""i am in init of package)
        #导入    
        import pkg01
        pkg01.ininit()
        -注意的是:此种方法默认对__init__.py内容的导入
    
    -import package.module #模块名
        -导入包中某一个具体的模块
        -使用方法
            package.module.func_name
            package.module.class.fun()
            package.module.class.var
            
        
        -案例
            -在pkg01中创建一个名为pp01.py的文件,且pp01.py中已经定义了类、函数等
            import pkg01.pp01
            stu = pkg.pp01.Student()
            stu.say()     
            
    -import package.module as PPM #别名

    -from ....import  导入
        -from package import module1,module2,module3
        -此种导入方法不执行__init__的内容
            from pkg01 import p01
            p01.say()
    
    -from package import *
        -导入当前包的__init__.py文件中所有的函数和类,其他的模块不导入
        -使用方法    
            func_name()
            class_name.func_name()
            class_name.var
        -from pkg01 import *
                ininit()
    
    -from package.module import *
        -导入包中指定模块的所有内容
        -使用方法
            func_name()
            class_name.func_name()
        
    -在开发环境中经常会索引其他模块,可以在当前包中直接导入其他模块中的内容
        -import 完整的包或者模块的路径

-“__all__”的用法

-在使用from package impor *的时候,*可以导入的内容
        -“__init__.py”中如果文件为空,或者没有“__all__”,那么只可以把“__init__”的内容导入
        -“__init__”如果设置了"__all__"的值,那么则按照指定的子包或者模块进行导入,不会载入其他"__init__"的内容
        __all__ = ["module1","module2","package1".....]
        
        -例
        包中创建一个__init__.py的文件和一个p01.py文件
        #在__init__中定义如下内容
        __all__ = ["p01"] #将p01.py载入
        def ininit():
            print("")
            
        #导入    
        from pkg01 import *
        stu = p01.Student
        stu.say()
        ininit() #报错

-命名空间

-用于区分不同位置不同功能但名称相同的函数或者变量的一个特定前缀
-作用是防止明明冲突

            setName()
            Student.setName()
            Dog.setName()

猜你喜欢

转载自www.cnblogs.com/houziaipangqi/p/9498689.html
今日推荐