第二十三章 模块代码编写基础

2023-11-02

模块的创建

python中的所有.py文件都能做为模块;

模块文件名

模块的命名应该遵循一般变量名的命名规则;

模块的使用

  • import语句
    import语句直接列出一个或多个需要加载的模块的名称,以逗号分隔。因为它用一个名称引用整个模块;
import module1. module2,....
# 函数调用
module1.func1()
module2.func2()
  • from语句
    from会把特定的名称从一个文件复制到另一个作用域,所以它可以让我们直接在脚本中使用复制后的名称,而不在需要通过模块:
from module import func
# 函数调用不需要通过模块名,直接调用
func()
  • from * 语句
    当我们使用 *代替特定的名称时,会取得模块顶层被赋值的所有名称的副本。即将模块中所有名称复制到了进行导入的作用域中;
from module import *
# 调用模块中的方法都不需要使用模块名
  • 导入只发生一次
    模块会在第一次import或from时被载入并执行,并且只在第一次是如此。这是有意为之的,因为导入是一个开销较大的操作。

import和from是赋值语句

就像def一样,import和from是可执行语句,而不是编译时的声明。并且可以嵌套在if测试中、出现在函数的def之中;

在模块中改变可变对象

就想def一样,import和from都是隐式的赋值语句:

  • import将整个模块对象赋值给一个单独的名称;
  • from将一个或多个名称赋值给另一个模块中的同名对象;
# File small.py
x = 1
y = [1, 2]

当使用from导入时,我们将名称复制到导入者的作用域,并已开始通过模块的名称来共享被引用的对象:

from small import x, y
x = 42
y[0] = 42

上面修改了变量之后,模块中的变量将发生变化:

import small
print(small.x)	# output:42
print(small.y)	# output:[42, 2]

import和from的等价性

从概念上说,一个像这样的from语句:

from module import name1, name2

等价于:

import module
name1 = module.name1
name2 = module.name2

from 语句潜在的陷阱

因为from语句会让变量的位置更隐式和模糊,所以有些python用户多数时候推荐使用import而不是from。

必须使用import的场景

当你必须使用两个不同模块中定义的同名变量时,就必须使用import而不能使用from:

# File M.py
def func():
	...do something...

# File N.py
def func():
	...do something...

当你需要在程序中同时使用这两个版本的名称时,from语句就难以胜任了,因为作用域内的一个名称只能对应一次赋值语句:

from M import func
from N import func
func()

为了解决这个困境,python提供了另一种方法:

from M import func as mfunc
from N import func as nfunc

模块命名空间

  • 模块语句会在首次导入时执行;
  • 顶层的赋值语句会创建模块属性;
  • 模块的命名空间可以通过属性__dict__或dir(M)获取;
  • 模块是一个独立的作用域(局部变量就是全局变量);

属性名称的点号运算

点号运算其实就是表达式,它会返回和对象相关的属性名的值。

# 点运算的语法

object.attribute

LEGB作用域规则只适用于无点运算的纯名称,它可能被用在一个名称路径中最左边的名称,在点号之后的名称则会搜索特定的对象。以下是其规则:

  • 简单变量:
    作用域内搜索名称X,遵循LEGB
  • 点号运算:
    X.Y是指在当前所用于内搜索X,然后搜素对象X中的属性Y;
  • 多层点号运算:
  • 通用性:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第二十三章 模块代码编写基础 的相关文章

随机推荐

  • like多个值_MySQL ---- 模糊查询 like和通配符 (七)

    like操作符 对于未知的进行搜索 结合通配符使用 通配符 wildcard 用来匹配值得一部分的特殊字符 搜索模式 search pattern 由字面值 统配符或两者组合的搜索模式 注意 1 通配符本身是SQL 的WHERE 子句有特殊
  • elementUi合并表格el-table第一列的相同内容的行

    如上图所示 路基包含水泥 砂石料 压实度 路床弯沉 钢筋接头这五行 所以我们要像ecxel表格一样合并路基这个单元格 具体按照以下来做 合并行 objectSpanMethod row column rowIndex columnIndex
  • 数据湖与数据仓库区别

    数据湖是近两年中比较新的技术在大数据领域中 对于一个真正的数据湖应该是什么样子 现在对数据湖认知还是处在探索的阶段 像现在代表的开源产品有iceberg hudi Delta Lake 那对于数据湖应该是什么样子 先来看数据湖的作者AWS来
  • Ubuntu 访问共享文件夹

    最近刚刚重装了 Ubuntu 18 04 版本 然后又要来一遍共享文件夹的事情了 摘自 关于ubuntu下访问windows的共享目录 假定您的网络连接已经正确设定好 网络主机的 IP 192 168 0 1 网络主机的使用者名称 myus
  • 论文阅读《LGPMA:Complicated Table Structure Recognition with Local and Global Pyramid Mask Alignment》

    摘要 表格识别是一项很有挑战的任务 以前的方法从不同粒度的元素 行 列 文本区域 开始处理问题 这从某种程度上有损启发式规则 忽略了空细胞分裂等问题 基于表结构特征 我们发现获取文本区域的对齐bounding box可以有效地保持不同单元格
  • Intellij IDEA 导入 eclipse web 项目详细操作

    Eclipse当中的web项目都会有这两个文件 但是idea当中应该是没有的 所以导入会出现兼容问题 但是本篇文章会教大家如何导入 并且导入过后还能使用tomcat运行 文章尽可能以图片的形式进行演示 我的idea使用的版本是2022 3
  • UE4_读写内容到文本文件

    1 新建一个c 文件 类型为BlueprintFunctionLibrary RWTextFile h Fill out your copyright notice in the Description page of Project Se
  • 谷歌云计算技术基础架构,谷歌卷积神经网络

    谷歌开源了TensorFlow 世界就要马上被改变了吗 Google开源了其第二代深度学习技术TensorFlow 被使用在Google搜索 图像识别以及邮箱的深度学习框架 这在相关媒体圈 工程师圈 人工智能公司 人工智能研究团队里有了一些
  • ajax调用java程序,从微信小程序到鸿蒙JS开发-JS调用Java

    除轻量级智能穿戴设备 现鸿蒙支持的手机 汽车 TV 手表 平板等属于富鸿蒙 在JS语言的项目中也有Java模块 并提供了JS跨语言调用Java方法的技术 现需要实现查看商品评论时 统计出长评 中评和短评的比例 这里将评论数据请求来后调用Ja
  • linux下内核态锁与用户态锁详细介绍

    1 内核态下锁 1 1 spinlock t spinlock t成为自旋锁 它用在临界区代码非常少的情况下 自旋锁不会引起调用者睡眠 如果自旋锁已经被别的执行单元保持 调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁 如果释放了该
  • 播放声音

    声音类型 load 上料 switchs 换装 changes 换程 private enum Sound load switchs changes SoundPlayer sp new SoundPlayer
  • 在.NET中杀死Word,Excel等进程

    下面的方法可以直接调用 private void KillProcess string processName System Diagnostics Process myproc new System Diagnostics Process
  • 【Learning RAW-to-sRGB Mappings with Inaccurately Aligned Supervision通过不准确对齐的监督学习 RAW 到 sRGB 的映射】

    摘要 学习 RAW 到 sRGB 映射近年来引起了越来越多的关注 其中训练输入的原始图像以模仿另一台相机捕获的目标 sRGB 图像 然而 严重的颜色不一致使得生成输入原始和目标 sRGB 图像的良好对齐训练对非常具有挑战性 虽然使用不准确对
  • 解决java解析XML文件时的“伪属性名称”问题

    解决java解析XML文件时的 伪属性名称 问题 一定是xml文件写错了格式
  • apk部分手机安装失败_安卓手机安装软件失败的4种常见原因和解决办法

    安卓手机安装软件是普通人都会做的事情 不过这也是有可能会出现问题的 比如安卓手机安装软件失败了 这要怎么解决 安卓手机安装软件失败是一些新手用户可能会遇到的问题 虽然有很多方面的原因 不过大体上分为软件和硬件2种情况 下面就整理一些解决方法
  • Unity初学者对物体移动的总结

    Unity小白笔记文章 请大家多多指教 关于Unity3D控制物体移动的常用方法 首先控制物体移动即控制物体的空间坐标变化 在这里首先我们要知道Input输入事件 一般大家先想到的都是按一个按键去控制物体移动 Unity里也给我们提供了这种
  • Web前端之如何描述自己做过的项目

    在面试时 经过寒暄后 一般面试官会让介绍项目经验 常见的问法是 说下你最近的 或最拿得 出手的 一个项目 根据我们的面试经验 发现有不少候选人对此没准备 说起来磕磕巴巴 甚至有人说出项目经验从时间 段或技术等方面和简历上的不匹配 这样就会造
  • Unity 弓箭射靶游戏实践

    一 实现思路 根据之前的飞碟工厂进行改变 在射出弓箭手上没有弓箭之后重新生成新的弓箭 并将射出的弓箭在一定时间后进行回收 在右下角通过小窗口展示靶子的情况 射中不同的环数给予不同得分 二 主要涉及技术 物理引擎的使用 游戏对象的生产与回收
  • 关于autorelease pool一个较好的理解

    如果你能够真正的理解autorelease 那么你才是理解了Objective c的内存管理 Autorelease实际上只是把对release的调用延迟了 对于每一个Autorelease 系统只是把该Object放入了当前的Autore
  • 第二十三章 模块代码编写基础

    模块的创建 python中的所有 py文件都能做为模块 模块文件名 模块的命名应该遵循一般变量名的命名规则 模块的使用 import语句 import语句直接列出一个或多个需要加载的模块的名称 以逗号分隔 因为它用一个名称引用整个模块 im