在使用tf.keras.layers 语法时,有一个疑问就是这两个点是python中的什么语法,as I know, 可以通过class.method() 调用类方法,但连续的几个点是什么呢? 再查了资料之后才明白,原来是与模块有关。

模块概念

模块是什么呢? Python 模块(Module),是一个 Python 文件,以 .py 结尾,是为了重复使用一些对象,比如类,函数,而将这些对象定义放在一个.py文件中,或是将一个较大的工程分解为多个.py文件而易于开发和维护。每一个.py文件都是一个module。将相关的代码放在一个模块里就是封装的思想,了解这个概念,有助于我们更好地使用python进行模块化编程。

创建模块

创建模块也非常简单,就是新建一个.py文件。 举个栗子,现在写了一个文件,命名为moduletest.py,如下:

# moduletest 
a = 'hello'
print(a)
def f(x): 
    return x 
class Pig: 
    def __init__(self,color):
        self.color = color

如何导入

在modeuletest.py 中新建了 变量,函数和类。然后只要路径正确如何设置路径,我们就可以把moduletest.py作为一个模块,在别的文件中引用,如下:

import moduletest
moduletest.a
moduletest.f(100)
Peppa = moduletest.Pig('red')
Peppa.color
>>>'hello'
>>>100
>>>'red'

注意: 模块名是 modeletest ,而不是moduletest.py

模块只有第一次被导入的时候执行,也只会导入一次。导入会编译生成字节码文件,也就是在每个模块中都可以找到的__pycache__ 文件, 里面存放moduletest的字节码文件moduletest.cpython-37 ,cpython代表的是c语言实现的Python解释器,-37代表的是版本为3.7版。python解释器在工作时,它先检查本地是否有上述字节码文件以及该字节码文件的修改时间是否在其源文件之后,是就直接执行,否则重复上述步骤。这就是为什么模块只会导入一次。
另外,如果我们只需要使用模块的部分功能,且模块较大,可以使用 from … import … 导入 ,比如:

from moduletest impport f 
f(1)   # 可以直接使用f(), 而不是moduletest.f()
>>>1

包 (package)

包就是多个模块的集合,当一个项目过大,涉及到多个模块, 就把模块封装起来,方便管理,封装的文件就是包。常用的matplotlib就是包。要让Python 解释器把一个目录作为package,则该目录下必须有__init__.py文件,init.py可以为空,当然也可以有对象定义和语句,用来做初始化工作。

多层导入

包有明确的目录结构,导入要注意路径结构。如下 :
>package1
  |– a.py
  |– b.py
>package2
  >package 3
    |– c.py

在同级路径下, 比如在程序a中导入b模块,可以直接 import b
在不同级路径下, 比如程序a中导入c模块,需要使用from ,比如:

from package2.package3 import c

这就是tf.keras.layers中点的用法,多层导入模块。使用module.file 查看模块路径也可以证明,如下:

from  tensorflow.keras import  layers 
print( layers.__file__ )
>>> 'C:\\soft\\Anaconda\\lib\\site-packages\\tensorflow\\keras\\layers\\__init__.py'

本文地址:https://blog.csdn.net/weixin_43705953/article/details/110921563