Reflection and Introspection in Python
1. Introduction
Reflection and introspection in Python are powerful features that allow developers to examine and manipulate objects at runtime. This lesson covers the definitions, key concepts, and practical examples to enhance your understanding of these capabilities.
2. Key Concepts
- Reflection: The ability of a program to examine its own structure and behavior.
- Introspection: The ability to determine the type or properties of an object at runtime.
3. Reflection
Reflection involves examining and modifying the properties and behaviors of objects. In Python, this can be achieved using the built-in functions and the inspect
module.
import inspect
class Sample:
def method(self):
return "method called"
sample = Sample()
methods = inspect.getmembers(sample, predicate=inspect.ismethod)
print(methods) # Outputs all methods of the sample instance
In the example above, we use inspect.getmembers
to retrieve all methods of the Sample
class instance.
4. Introspection
Introspection allows you to examine the type or properties of an object. Common functions used for introspection include type()
, dir()
, and isinstance()
.
sample = Sample()
print(type(sample)) # Outputs: <class '__main__.Sample'>
print(dir(sample)) # Outputs attributes and methods of the sample instance
print(isinstance(sample, Sample)) # Outputs: True
Using these functions, you can gather information about the objects you are working with, which can be helpful for debugging and dynamic behavior.
5. Best Practices
- Use reflection and introspection sparingly to avoid complexity.
- Document your code to clarify when and why reflection is used.
- Test extensively to ensure that dynamic behavior does not introduce bugs.
6. FAQ
What is the difference between reflection and introspection?
Introspection is the ability to examine the type or properties of an object, while reflection involves modifying the structure or behavior of objects at runtime.
Can introspection be used on built-in types?
Yes, introspection works on both user-defined and built-in types in Python.
Is reflection slower than direct access?
Yes, reflection can introduce overhead compared to direct attribute access, so it should be used wisely.