这是我参与11月更文挑战的21天,活动详情查看:2021最后一次更文挑战。
模块(module)
模块module : 用来包装定义的函数和变量的文件,其扩展名为.py。
例如,python标准库。导入模块的方式:
# 仅把模块导入。调用模块函数通过:模块名称.函数名称
import module_name
# 从模块中导入指定部分到当前命名空间
from module_name import name1,name2..
# 导入一个模块中所有项目。不建议使用。浪费内存,命名冲突
from module_name import *
# as 关键字:类似起别名,解决命名冲突
from module_name import func as test_func
文件操作
在实际操作中,通常需要将数据写入到本地文件或者从本地文件中读取数据等操作,那么作为Python爱好者的我们,必须掌握用Python语言去对本地文件进行操作。
本地文件操作步骤:
- 找到文件所在位置;
- 打开文件;
- 操作文件;
- 关闭文件。
新建Students.txt,通过f.readlines()读取文件全部内容
去掉\n换行符:
f = open('Students.txt','r')
res = f.readlines()
for i in range(len(res)):
res[i] = res[i].rstrip("\n")
print(res)
f.close() # 关闭文件
创建test02.txt文件,并且写入内容:
f = open('test02.txt','w')
# f.write("Hello World")
f.write("Logic Education") # 覆盖
f.close()
操作二进制:
b = b'hello world'
f = open('test5.txt','wb')
f.write(b)
Python操作json文件:
import json
data = {"name":"cat"} # python对象 字典
f = open('data.json','w')
json.dump(data,f) # 将python对象转为json对象 写入f文件
要注意的是,当文件打开之后,必须通过f.close()语句来关闭文件,释放资源:
try:
f = open('test2.txt','r')
f.read()
finally:
if f:
f.close()
上下文管理器,可以防止诸如open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,语法:
with open()
Python提供了with这个上下文管理器机制,保证文件会被正常关闭。
在它的管理下,不需要再写close语句。其余操作都同open()一致。
with open('Students.txt','r') as f:
print(f.readlines())
反射
在实际开发时,当开发者想要执行对象里的方法或者属性时,但是无法确定该方法及属性一定存在。这时就需要使用一些特殊的方法来访问与操作这个未知的方法或属性,那么此时程序员即会使用反射处理。
反射实际上就是通过字符串的形式,导入模块。通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,是一种基于字符串的事件驱动。
hasattr(obj,name_str): 判断obj是否有name_str这个方法或者属性;getattr(obj,name_str): 获取obj对象中与name_str同名的方法或者函数;setattr(obj,name_str,value): 为obj对象设置一个以name_str为名的value方法或者属性;delattr(obj,name_str): 删除obj对象中的name_str方法或者属性。
#通过输入字符串导入模块
ImModule = input('请输入要加载的模块名:')
Module = __import__(ImModule)
Module.func()
#Part2
ImModule = input('请输入要加载的模块名:')
Module = __import__(ImModule)
ImFunc = input('请输入要调用的方法')
#getattr仅反射了该方法的内存地址
func = getattr(Module,ImFunc,None)
#调用该方法
func()
当使用import导入Python模块的时候,默认调用的是__import__()函数。直接使用该函数的情况很少见,一般用于动态加载模块。__import__(name, globals, locals, fromlist, level)只有name是必选参数,其他都是可选参数,一般情况下直接使用name参数即可。