版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1、什么是反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。
2、反射机制的四个方法
- getattr 获取指定字符串名称的对象属性
- setattr 为对象设置一个对象
- hasattr 判断对象是否有对应的对象(字符串)
- delattr 删除指定属性
Animal类如下
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def breathe(self):
print("呼吸")
2.1、hasattr
if __name__ == '__main__':
animal = Animal("佩奇", 2)
print(hasattr(animal, "name")) # 检测试animal对象是否可以调用name属性
print(hasattr(animal, "breathe")) # 检测试animal对象是否可以调用breathe属性
输出:
True
True
2.2、getattr
if __name__ == '__main__':
animal = Animal("佩奇", 2)
print(getattr(animal,"name")) #获取animal对象的name属性的值
print(getattr(animal,"breathe")) #获取animal对象的breathe属性的值
print(getattr(animal, "aaaaaaaa","没有这个属性")) # 获取animal对象的breathe属性的值
输出:
佩奇
<bound method Animal.breathe of <main.Animal object at 0x000000F0D30F0F28>>
没有这个属性
2.3、setattr
- 用于设置属性值,该属性不一定是存在的。
if __name__ == '__main__':
animal = Animal("佩奇", 2)
setattr(animal,"name","乔治")
print(animal.name)
输出:
乔治
2.4、delattr
if __name__ == '__main__':
animal = Animal("佩奇", 2)
print(animal.__dict__)
delattr(animal,"name")
print(animal.__dict__)
输出:
{‘name’: ‘佩奇’, ‘age’: 2}
{‘age’: 2}
3、如何获得当前模块名
x = 1
import sys
obj = sys.modules[__name__]
print(getattr(obj, "x"))
输出:
1