Python中的反射
Python中的反射和java 等语言的形式不同。
举个栗子
class Foo:
class_file = '123'
def __init__(self,name,age):
self.name = name
self.age = age
obj = Foo('testname',22)
b = 'name'
上面的程序中,创建了一个类 接收两个变量 name 和 age 现在创建了一个Foo的对象,封装了 'testname' 和 22,现在只知道属性字段是'name' 有没有一种办法能直接拿到对象中的name字段对应的属性呢
- 通过dict
我们知道dict是内置方法,该方法以字典的形式返回该类定义的所有字段。
print(obj.__dict__['name'])
- getattr() 获取属性
getattr(obj,name) 为从一个对象中获取属性,这个对象可以是类对象 可以是模块 也可以是p
print(getattr(obj, b)) # 获取属性
# 获取方法
print(getattr(obj, b))
func = getattr(obj,'show')
r = func()
# 获取类属性
print(getattr(Foo, 'class_file'))
- hasattr 通过反射判断是否有某个字段
print(hasattr(obj, b))
- setattr 通过反射设置某个属性
setattr(obj,b,'hello')
print(obj.show())
>>> hello-22
- delattr 通过反射删除属性
delattr(obj,b)
print(obj.show()) # 由于删除了name所以会报错