反射是一种程序运行时检测和修改其自身结构的能力。在Python中,我们可以通过几种方式实现反射:
1. 使用type()
和isinstance()
:
- type()可以获取对象的类型。
- isinstance()可以判断对象的类型。
- 用法:
class Foo:
pass
f = Foo()
type(f) # <class '__main__.Foo'>
isinstance(f, Foo) # True
2. 使用getattr().setattr()和delattr()
:
- getattr()可以读取对象的属性值。
- setattr()可以设置对象的属性值。
- delattr()可以删除对象的属性。
- 用法:
class Foo:
bar = 1
f = Foo()
getattr(f, 'bar') # 1
setattr(f, 'bar', 2)
getattr(f, 'bar') # 2
delattr(f, 'bar')
getattr(f, 'bar') # AttributeError
3. 使用inspect
模块:
- inspect模块可以获取Python对象的许多信息。
- 我们可以使用它实现反射。
- 用法:
import inspect
class Foo:
def func(self):
pass
f = Foo()
inspect.isclass(Foo) # True, 判断Foo是一个类
inspect.ismethod(f.func) # True, 判断f.func是一个方法
inspect.getmembers(f) # [('func', <bound method Foo.func of <__main__.Foo object at 0x10d173050>>)], 获取f的所有成员
4. 使用eval().exec()和compile()
:
- eval()可以运行字符串表达式。
- exec()可以运行字符串语句。
- compile()可以编译字符串为代码。
- 用法:
code = 'print(1 + 2)'
eval(code) # 3
exec(code) # 3
code = 'def func(): print(1 + 2)'
c = compile(code, '', 'exec')
exec(c) # 执行代码并定义func函数
func() # 3