Python的反射机制指的是在运行时(runtime)动态地获取对象的信息、调用对象的方法、访问对象的属性等能力。反射使得你可以根据需要在运行时操作对象,而不需要在编译时确定对象的类型。在Python中,反射主要通过以下几个内置函数和特殊方法来实现:
-
dir()
函数:dir(obj)
用于列出对象obj
的所有属性和方法。这包括对象的内置属性和方法,以及用户自定义的属性和方法。 class MyClass: def __init__(self): self.name = "John" self.age = 30 def say_hello(self): print(f"Hello, my name is {self.name}.") obj = MyClass() # 使用 dir() 函数列出对象的属性和方法 attributes_and_methods = dir(obj) print(attributes_and_methods)
-
getattr()
函数:getattr(obj, name[, default])
用于获取对象obj
的属性或方法name
的值。如果属性或方法不存在,可以提供一个可选的默认值。class Person: def __init__(self, name, age): self.name = name self.age = age person = Person("Alice", 25) # 使用 getattr() 函数获取对象的属性值 name = getattr(person, "name") age = getattr(person, "age") print(name, age)
-
setattr()
函数:setattr(obj, name, value)
用于设置对象obj
的属性或方法name
的值为value
。如果属性或方法不存在,它会创建一个新的属性或方法。class Car: def __init__(self, make, model): self.make = make self.model = model car = Car("Toyota", "Camry") # 使用 setattr() 函数设置对象的属性值 setattr(car, "make", "Honda") setattr(car, "color", "Blue") # 创建新属性 print(car.make, car.model, car.color)
-
hasattr()
函数:hasattr(obj, name)
用于检查对象obj
是否有属性或方法name
。如果有,返回True
,否则返回False
。class Dog: def __init__(self, name): self.name = name dog = Dog("Buddy") # 使用 hasattr() 函数检查对象是否有某个属性 has_name = hasattr(dog, "name") has_age = hasattr(dog, "age") print(has_name) # True print(has_age) # False
-
delattr()
函数:delattr(obj, name)
用于删除对象obj
的属性或方法name
。class Book: def __init__(self, title): self.title = title book = Book("Python Programming") # 使用 delattr() 函数删除对象的属性 delattr(book, "title") # 尝试访问已删除的属性将引发 AttributeError # print(book.title)
-
globals()
和locals()
函数:这些函数用于获取全局和局部命名空间中的变量和函数。x = 10 def my_function(): y = 20 print(locals()) # 获取局部命名空间中的变量和函数 print(globals()) # 获取全局命名空间中的变量和函数
-
vars()
函数:vars(obj)
返回对象的__dict__
属性,它包含对象的属性和方法。class MyClass: def __init__(self): self.x = 10 self.y = 20 obj = MyClass() print(vars(obj)) # 返回对象的属性字典 {'x': 10, 'y': 20}
-
callable()
函数:callable(name)
用于检查对象是否可以调用,例如检查函数、方法或类是否可调用。def my_function(): print("Hello, World!") class MyClass: def my_method(self): print("Method called") # 检查对象是否可调用 is_function_callable = callable(my_function) is_method_callable = callable(MyClass.my_method)
-
特殊方法(例如
__getattr__
、__setattr__
和__delattr__
):你可以在自定义类中定义这些特殊方法,以自定义对象的属性和方法访问行为。# __getattr__ 在尝试访问不存在的属性时触发,可以用来动态生成属性值。 class DynamicAttribute: def __getattr__(self, name): if name == 'example': return "This is a dynamically generated attribute." else: raise AttributeError(f"'DynamicAttribute' object has no attribute '{name}'") obj = DynamicAttribute() print(obj.example) # 输出: This is a dynamically generated attribute. # 尝试访问不存在的属性 # print(obj.undefined) # 抛出 AttributeError # __setattr__ 在尝试设置属性值时触发,可以用来控制属性的设置行为。 class RestrictedAttribute: def __init__(self): self._value = None def __setattr__(self, name, value): if name == '_value': print("Setting _value attribute is not allowed.") else: super().__setattr__(name, value) obj = RestrictedAttribute() obj._value = 42 # 正常设置 # 尝试设置受限制的属性 obj.value = 100 # 输出: Setting _value attribute is not allowed. print(obj.value) # 输出: 100 # __delattr__ 在尝试删除属性时触发,可以用来控制属性的删除行为。 class ProtectedAttribute: def __init__(self): self._value = None def __delattr__(self, name): if name == '_value': print("Deleting _value attribute is not allowed.") else: super().__delattr__(name) obj = ProtectedAttribute() obj._value = 42 # 正常设置 # 尝试删除受保护的属性 del obj._value # 输出: Deleting _value attribute is not allowed. print(obj._value) # 输出: 42