Python学习系列之反射

反射的定义

根据字符串的形式去某个对象中操作成员

  1. 根据字符串的形式去某个对象中寻找成员
  2. 根据字符串的形式去某个对象中设置成员
  3. 根据字符串的形式去某个对象中删除成员
  4. 根据字符串的形式去某个对象中判断成员是否存在

反射相关函数

getattr(object,name,[default])

获取一个对象的属性或者方法,如果存在就打印出来,如果不存在就打印出默认值,默认值是可选的

注意:返回的对象方法,返回的是内存地址,如果需要执行这个方法,需要在后面加上括号'()'

>>> class test():
 ...     name="xiaohua"
 ...     def run(self):
 ...             return "HelloWord"
 ...

 >>> t=test()           #实例化这个类
 >>> getattr(t, "name") #获取name属性,存在就打印出来。
 'xiaohua'


 >>> getattr(t, "run")        #获取run方法,存在就打印出方法的内存地址。
<bound method test.run of <__main__.test instance at 0x0269C878>>

>>> func = getattr(t, "run")  #获取run方法,加个括号就可以执行这个方法
>>> func()
'HelloWord'


>>> getattr(t, "age")       #获取一个不存在的属性,就报错
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: test instance has no attribute 'age'
>>> getattr(t, "age","18")  #若属性不存在,返回一个默认值。
'18'

setattr(object,name,value)

给对象的属性赋值,若属性不存在,就先创建在赋值

 1 >>> class test():
 2 ...     name="xiaohua"
 3 ...     def run(self):
 4 ...             return "HelloWord"
 5 ...
 6 >>> t=test()
 7 >>> hasattr(t, "age")   #判断属性是否存在
 8 False
 
 9 >>> setattr(t, "age", "18")   #为属相赋值,并没有返回值
10 >>> hasattr(t, "age")    #属性存在了
11 True
12 >>>

delattr(object,name)

根据字符串的形式去某个对象中删除成员

>>> getattr(commons, "Name")
'ZhaiJunMing'
>>> delattr(commons, "Name")
# 获取不到就报错
>>> getattr(commons, "Name")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'commons' has no attribute 'Name'

hasattr(object,name)

根据字符串的形式去某个对象中判断成员是否存在

比如:判断一个对象里面是否有name属性或者name方法,返回bool值,有则True,否则False

1 >>> class test():
 2 ...     name="xiaohua"
 3 ...     def run(self):
 4 ...             return "HelloWord"
 5 ...


 6 >>> t=test()
 7 >>> hasattr(t, "name") #判断对象有name属性
 8 True
 
 9 >>> hasattr(t, "run")  #判断对象有run方法
10 True
11 >>>
原文地址:https://www.cnblogs.com/chadiandianwenrou/p/6159850.html