Python第三周第一次作业中关于工程目录各种导入的模拟学习

@

Python工程目录 导入自定义模块, 包

工程目录与模块和包,软件开发规范相关联

记录的缘由

  • 提交memo工程作业的时候助教提出包内过多的绝对路径,所以记录此篇

  • 绝对路径使用的原因是第一次提交工程目录作业,在模拟测试时无法将文件记录保存到相应的文件夹内所以在模块中写死路径从而实现需求

  • 核心思路: 解耦

设计的核心思想:尽可能减少代码耦合,如果发现代码耦合,就要采取解耦技术。让数据模型,业务逻辑和视图显示三层之间彼此降低耦合,把关联依赖降到最低,而不至于牵一发而动全身。原则就是A功能的代码不要写在B的功能代码中,如果两者之间需要交互,可以通过接口,通过消息,甚至可以引入框架,但总之就是不要直接交叉写

Although that way may not be obvious at first unless you're Dutch. --by Tim Peters

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)

模块搜索路径

python解释器在启动时会自动加载一些模块,可以使用sys.modules查看
在第一次导入某个模块时(比如memo),会检查该模块是否已经被加载到内存中(执行文件的名称空间对应的内存),如果有则直接引用,如果没有,解释器则会查找同名的内建模块,如果还没有找到就从sys.path给出的目录列表中依次寻找memo.py文件.

总结模块的查找顺序:内存中已经加载的模块-->内置模块-->sys.path路径中包含的模块

需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。

在模块入口初始化,python程序可以修改sys.path路径, 放到前面的优先于标准库被加载

import sys

sys.path.append(路径)  # 往sys.path里面添加路径```

## 模块:
1. 把模块当做脚本执行:
我们可以通过模块的全局变量`__name__`来查看模块名
2. 当做脚本运行:
`__name__` 等于`'__main__'`
3. 当做模块导入:
`__name__` 等于模块名

- `如果一个py文件被导入了,他就是一个模块`

- `如果这个py文件被直接执行,这个被直接执行的文件就是一个脚本`

>作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
https://www.py3study.com/Article/details/id/229.html

## 导入模块

### 导入函数

>https://www.cnblogs.com/lataku/p/10434812.html#%E5%AF%BC%E5%85%A5%E6%A8%A1%E5%9D%97%E7%9A%84%E6%96%B9%E6%B3%95%E5%A6%82%E4%B8%8B

### 导入类
1. 随着你不断给类添加功能,导致`py文件`会变得越来越长, 为遵循Python的总体理念,应该让文件尽可能的整洁,方便阅读.
    - `重构, 是一种美德`
2. 自定义工作流程:
    - 首先: 尽可能的在一个`py文件`中完成需求内容, 确定一切都能正常运行后就可以对文件的类方法进行拆分
    - 其次: 将类移动到独立的模块中, 让一个模块完成一项工作
    - 最后: 可以让文件和模块获得友好的交互, 这样的代码更具有组织,更为有序,修改时更为高效

演示过程采用截图..因为要使用IDE

#### 导入单个类:
- 创建一个`car.py`文件

- 新增`my_car.py`文件,导入`car.py`并创建其实例

![](https://img2018.cnblogs.com/blog/1606938/201903/1606938-20190303164854016-27811994.png)



### 多个类
1. 一个模块存储多个类,并调用
2. 一个模块导入多个类
3. 导入整个类

![](https://img2018.cnblogs.com/blog/1606938/201903/1606938-20190303164906197-2066028961.png)




```python
# 从一个模块导入多个类

from car import Car, ElectCar

my_bettle = Car('绿绿的电池', 'bettle', 2015)
print(my_bettle.get_descriptive_name())

my_elect_car = ElectCar('tesla', 'rode', 2018)
print(my_elect_car.get_descriptive_name())

# ------------分割线------------
# 导入整个模块
import car

my_bettle = car.Car('volk', 'bettle', 2008)
print(my_bettle.get_descriptive_name)

my_elect_car = ElectCar('tesla', 'rode', 2018)
print(my_elect_car.get_descriptive_name())

然后:

重构吧,把路径部分再写一个settings.py,然后调用

posted @ 2019-03-03 16:50  lataku~~  阅读(322)  评论(0编辑  收藏  举报