python笔记 初识反射

56 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)

image.png

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__)   

image.png

3 总结

补充了上下文管理(contextlib),简单写法,了解即可。大概知道下反射的定义,以及指出日常用的较多,但不知道它是它的情况,知道它的目的,之后的学习就好办了。