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

模块的创建

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;
  • 多层点号运算:
  • 通用性:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值