持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 上下文管理补充(contextlib)
之前的上下文管理需要先整个类,但是有时候我只是想实现一个简单的功能,并不需要单独去写个类。python帮我们提供了一个类contextlib。
这里的try...finally,属于异常处理的范畴,try里面的语句会被执行,如果有错,就会报异常。不管如何finally终会执行。是不是和__enter__和__exit__对应上了。简单了解contextlib即可。
import contextlib
# 将生成器转为上下文管理
@contextlib.contextmanager
def demo():
# 等同于__enter__方法
print("进入 demo")
try:
# 等同于__enter__返回值
yield "123"
# return "123"
finally:
# 等同于__exit__方法
print("结束")
with demo() as d:
print(d)
1 反射前文
反射听到的很多,很多语言中也会出现它的身影,宛如大众女神一样,只知道它很美(虽然知道反射对于python面向对象很重要),然后没了,一般脑子里没有那么个清晰的概念的。一旦我们认识了,在别人的项目,才知道原来还可以这么写。
2 反射的定义
程序运行时,获取类的信息。在类中,我们也会见到获取类实例的属性、方法,比如dir(实例),实例.__dict__等。如下代码: 我想获取Demo这个类实例的属性和方法,dir就可以得到是不是很方便,而且不仅可以获取到它的属性,还可以动态的添加属性,也可以修改已存在属性里的值。也就说我不需要在去单独写方法,得到self.a,self.b,直接就可以获取到这些属性,当真好使。
class Demo:
def __init__(self, a, b):
self.a = a
self.b = b
d = Demo(1, 2)
print("dir -->", dir(d))
print("\n __dict__ -->", d.__dict__)
print("\n __dict__ -->", d.__dict__["a"])
d.__dict__["a"] = 11
d.__dict__["c"] = 3
print("\n __dict__ -->", d.__dict__)
3 总结
补充了上下文管理(contextlib),简单写法,了解即可。大概知道下反射的定义,以及指出日常用的较多,但不知道它是它的情况,知道它的目的,之后的学习就好办了。