python之反射
一、下列方法适用于类和对象
1.hasattr(object,name)
判断对象object中有没有name对应的方法或者属性 ##注意点name在括号中类型应为字符串类型
class A: def __init__(self, age): self.age = age print(age) def put_name(self): print('aa') B = A('21') a = hasattr(B, 'put_name') b = hasattr(B, 'age') print(a) print(b) 输出为: 21 True True
2.getattr(object, name, default=None)
得到对象object中name对应的方法或者属性
class A: def __init__(self, age): self.age = age print(age) def put_name(self): print('aa') B = A('21') a = getattr(B, 'put_name') print(type(a)) b = getattr(B, 'put_name')() d = getattr(B, 'age') print(d) print(type(d)) 输出内容; 21 <class 'method'> aa #执行put_name这个方法 21 #得到了age这个属性 <class 'str'>
3.setattr(object,attr,value)
创建object的新属性value
class A: def __init__(self, age): self.age = age print(age) def put_name(self): print('aa') B = A('21') setattr(B, 'name', 'sb') #name 是对象的属性,'sb' 是属性的值 print(B.name) 输出为: 21 sb
delattr(object,x)
将object中的属性删除
class A: def __init__(self, age): self.age = age print(age) def put_name(self): print('aa') B = A('21') setattr(B, 'name', 'sb') #name 是对象的属性,'sb' 是属性的值 print(B.name) delattr(B, 'name') print(B.__dict__) 输出: 21 sb {'age': '21'} #属性中只剩下age
二.当前模块和不同模块之间的反射
1.反射当前模块的对象
import sys def s1(): print('s1') def s2(): print('s2') this_module = sys.modules[__name__] print(hasattr(this_module, 's1')) print(getattr(this_module, 's2')) 输出: True <function s2 at 0x100e110d0>
2.反射其他模块的方法或类
文件 a.py import sys class A: def __init__(self, name): self.name = name pass def s1(self): print('s1') def s2(self): print('s2') 在同目录的b.py文件下 import a as fix print(hasattr(fix, 'A')) a = getattr(fix, 'A')('gao') print(a.name) 输出: <class 'a.A'> True gao