关键函数:hasattr()、getattr()、setattr()
,主要作用为实现反射机制,可以动态加载方法或者类中属性等
-
hasattr(object,name)
判断object对象里面是否有name属性或者name方法,object可以是类,也可以是模块,即限定范围,有name返回true,无name反馈false
def test1():
print("test1")
class test2():
name="test2"
def test3(self):
print("test3")
#测试:
import __main__
hasattr( __main__,"test1") #"test1" 中间显示不能有空格
hasattr( __main__,"test2")
hasattr( __main__,"test3")
hasattr( test2() ,"test2")
hasattr( test2() ," name ")
hasattr( test2() ," test3 ")
#结果:
true
true
false
false
true
true
-
getattr(object,name,[default])
获取对象的属性或者方法,倘若没有default,没有找到改属性或者方法时,直接报错,反之如果获取的是方法,返回方法的内存地址,如果需要调用改方法,加括号,有需要传参,记得传参
def test1():
print("test1")
def test2(aa):
print("test2 %s" %aa)
#测试:
if __name__ == "__main__":
import __main__
print(getattr(__main__,'test1'))
print(getattr(__main__, 'test2'))
print(getattr(__main__, 'test4',"bucunzai"))
#结果:
<function test1 at 0x001846F0>
<function test2 at 0x005F3150>
bucunzai
getattr(__main__,'test1')()
getattr(__main__, 'test2')(11)
#结果:
test1
test2 11
-
setattr(object,name,values)
给对象属性赋值,如果存在直接赋值,如果不存在,先创建再赋值
class test():
name="test"
def run(self):
print("run")
def p(self):
print(self.name)
#测试:
if __name__ == "__main__":
t=test()
setattr(t,'name','123')
setattr(t, 'age', 12)
t.p()
print(getattr(t,"age"))
#结果:
123
12
项目实践
轨迹及心率数据解析脚本、原始数据解析脚本