在Python中,反射(Reflection)通常指的是在运行时检查和修改对象、类、模块等的属性和方法的能力。Python的动态特性使得它在反射方面非常灵活。以下是Python中反射的一些常见用法:
- getattr(): 获取对象的属性。如果属性不存在,可以指定一个默认值。
class MyClass:
def __init__(self):
self.my_attribute = 42
obj = MyClass()
print(getattr(obj, 'my_attribute')) # 输出: 42
print(getattr(obj, 'non_existent_attribute', 'Default Value')) # 输出: Default Value
- hasattr(): 检查对象是否具有某个属性。
class MyClass:
def __init__(self):
self.my_attribute = 42
obj = MyClass()
print(hasattr(obj, 'my_attribute')) # 输出: True
print(hasattr(obj, 'non_existent_attribute')) # 输出: False
- setattr(): 设置对象的属性。如果属性不存在,则创建它。
class MyClass:
pass
obj = MyClass()
setattr(obj, 'my_attribute', 42)
print(obj.my_attribute) # 输出: 42
- delattr(): 删除对象的属性。
class MyClass:
def __init__(self):
self.my_attribute = 42
obj = MyClass()
delattr(obj, 'my_attribute')
# print(obj.my_attribute) # 这将引发AttributeError,因为属性已被删除
- callable(): 检查对象是否可以被调用(例如,是否是一个函数或方法)。
def my_function():
pass
print(callable(my_function)) # 输出: True
print(callable(42)) # 输出: False
- dir(): 列出对象的所有属性和方法。这对于探索未知对象非常有用。
class MyClass:
def my_method(self):
pass
obj = MyClass()
print(dir(obj)) # 输出包含'my_method'和其他内置属性和方法的列表
- getattr() 和 setattr() 用于模块:你还可以使用
getattr()
和setattr()
来动态地获取和设置模块级别的变量和函数。
# mymodule.py 文件内容:
my_variable = 42
def my_function():
return "Hello from my_function!"
# 主程序:
import mymodule
print(getattr(mymodule, 'my_variable')) # 输出: 42
print(getattr(mymodule, 'my_function')()) # 输出: Hello from my_function!
- 动态导入模块:使用
importlib
库可以动态地导入模块。
import importlib
module_name = "math" # 你可以根据需要更改此名称
module = importlib.import_module(module_name)
print(module.sqrt(16)) # 输出: 4.0(假设module_name被设置为"math")