Python中的反射与内省容许代码觉察和批改它本人。反射指的是程序在运行时能够拜访、检测和批改它本人的构造或行为的一种能力。而内省则更侧重于查看对象的类型和属性,比方查看一个对象是否有某个属性或办法,以及查看对象的文档字符串等。本文将深入探讨Python的反射与内省能力。
一、根底的反射函数
Python提供了许多内置函数来反对反射。比方type
,id
,getattr
,setattr
和hasattr
等。
class MyClass: def __init__(self): self.my_attribute = 123 self.another_attribute = "Hello" def my_method(self): passinstance = MyClass()# 应用type检测对象类型print(type(instance)) # 输入: <class '__main__.MyClass'># 应用id获取对象内存地址print(id(instance)) # 应用getattr获取属性值print(getattr(instance, 'my_attribute')) # 输入: 123# 应用setattr批改属性值setattr(instance, 'my_attribute', 456)print(getattr(instance, 'my_attribute')) # 输入: 456# 应用hasattr检测是否有某个属性print(hasattr(instance, 'nonexistent_attribute')) # 输入: False
二、dir函数和__dir__
办法
dir
函数和__dir__
办法能够用来获取一个对象的所有属性和办法。
class MyClass: def __init__(self): self.my_attribute = 123 def my_method(self): passinstance = MyClass()print(dir(instance))
输入将蕴含my_attribute
和my_method
,以及一些由Python主动增加的魔法办法。
三、反射在动静操作中的利用
反射在须要进行动静操作时十分有用,比方咱们能够基于字符串的名字来调用办法:
class MyClass: def my_method(self): return "Hello, world!"instance = MyClass()method_name = 'my_method'method = getattr(instance, method_name)print(method()) # 输入: Hello, world!
四、内省的一些有用工具
Python规范库提供了一些用于内省的有用工具,比方inspect
模块:
import inspectclass MyClass: def my_method(self): return "Hello, world!"print(inspect.getmembers(MyClass))
getmembers
函数返回一个蕴含所有成员的列表。
五、总结
Python的反射和内省机制提供了弱小的工具,使得咱们的代码能够在运行时查看和批改本身。