python模块
    最开始学了函数,函数可以用def定义;后面又学了类,类包含了变量又包含了函数,用class来定义;现在又到了python的模块,在模块中,我们不单可以存放变量,还可以存放函数和类,是一个集三者于一身的大成,且不需要任何语言去封装,可以理解为一个文件即为模块,一个test.py就是一个模块。
    Day3 - 图1
    函数和模块都是用来实现功能的,只是模块的范围比函数广,在模块中,可以有多个函数。模块的最大好处是大大提高了代码的可维护性,其次,代码不需要常常去编写,当需要时,可以去采用python自带或外部扩展的模块,更加方便了程序的编写。并且为此可以大大减少编写时出错导致的出现问题时难以查找,还可以避免函数名和变量名冲突。Python 本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用。
    模块还可以分为标准库模块和自定义模块,标准库即为你python文件库自带的模块,而自定义字如其名是由自己编写而成的模块。

    模块的使用
    Python 模块的使用跟其他编程语言也是类似的。你要使用某个模块,在使用之前,必须要导入这个模块。导入模块我们使用关键字import.
    (下面是import的基本语法)↓
    import module1[,module2[, ….moduleN]
    最简单的示范例子,采用模块解释π↓:
    import math
    print(math.pi)
    一个模块只会被导入一次,不管你执行了多少次 import。这样可以防止导入模块被一遍又一遍地执行
    当我们使用 import 语句的时候,Python 解释器是怎样找到对应的文件的呢?
    这就涉及到 Python 的搜索路径,搜索路径是由一系列目录名组成的,Python 解释器就依次从这些目录中去寻找所引入的模块。这看起来很像环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径。搜索路径是在 Python 编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys 模块中的 path 变量 。
    因此,我们可以查一下路径:
    import sys
    print(sys.path)
    这样他就会反馈模块所在库的具体位置给回你。

    From…import…
    Python 中,导入一个模块的方法我们使用的是import关键字,这样做是导入了这个模块,这里需要注意了,这样做只是导入了模块,并没有导入模块中具体的某个属性或方法的。而我们想直接导入某个模块中的某一个功能,也就是属性和方法的话,我们可以使用from…import 语句..
    两者的区别在于import**导入 sys 模块,然后使用 version 属性,而from…import 直接导入 version 属性.
    那么当想使用其他属性时,则可以采用
    import…import*语句,这个语句可以把某个模块中的所有方法属性都导入.

    Name属性-主模块与非主模块
    在 Python 中,有主模块和非主模块之分,怎么区分主模块和非主模块呢?这就需要用到
    name属性了,这个name属性值是一个变量,且这个变量是系统给出的。利用这个变量可以判断一个模块是否是主模块。如果一个属性的值是 main ,那么就说明这个模块是主模块,反之亦然。但是要注意了: 这个__main属性只是帮助我们判断是否是主模块,并不是说这个属性决定他们是否是主模块,决定是否是主模块的条件只是这个模块有没有被人调用.
    image.png**
    在上面例子中我们创建一个lname模块,由于该模块是直接使用,而没有被人调用,所以是主模块,因此会输出为main.但是当我们另外创建一个模块采用时,则会输出为not main,因为lname模块已经调用过了,所以不是主模块
    image.png


    包,其实在上面的一些例子中,都创建了不同的包名了,具体可以仔细观察
    在一开始模块的简介中提到,使用模块可以避免函数名和变量名冲突。
    相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
    但是这里也有个问题,如果不同的人编写的模块名相同怎么办?
    为了避免模块名冲突,Python 又引入了按目录来组织模块的方法,称为包(Package)Day3 - 图4
    每一个包目录下面都会有一个 init.py的文件,为什么呢?
    因为这个文件是必须的,否则,Python 就把这个目录当成普通目录,而不是一个包 。init.py可以是空文件,也可以有Python代码,因为 init.py本身就是一个模块,而它对应的模块名就是它的包名.

    作用域
    在python中也有着和Java里面一样给类里面可以给方法和属性定义公共的( public )或者是私有的 ( private ),这样做主要是为了我们希望有些函数和属性能给别人使用或者只能内部使用。
    在 Python 中,是通过 _ 前缀来实现的。正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,ni12,PI等;类似xxx这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的name就是特殊变量,还有 author也是特殊变量,用来标明作者。
    但是注意,我们自己的变量一般不要用这种变量名;类似_xx _xxx 这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc__abc等;
    这里是说不应该,而不是不能。因为 Python 种并没有一种方法可以完全限制访问 private 函数或变量,但是,从编程习惯上不应该引用 private 函数或变量。
    比如↓
    image.png输出的结果为↓
    尊敬的钻石会员用户,你好
    DiamondVIP2
    在这个模块中,我们公开vip_lv_name方法函数,而其他内部的逻辑分别在 _diamod_vip_gold_vip private 函数中实现,因为是内部实现逻辑,调用者根本不需要关心这个函数方法,它只需关心调用 vip_lv_name的方法函数,所以用 private 是非常有用的代码封装和抽象的方法
    一般情况下,外部不需要引用的函数全部定义成 private,只有外部需要引用的函数才定义为 public。