getattr(),hasattr(),setattr()是python实现“自省”的三个重要方法,用来访问或者检查对象属性,这些方法可以用于任意对象,python中一切都是对象。
(1)hasattr(obj, attr):
这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。
(2)getattr(obj, attr):
调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为'bar',则返回obj.bar。
(3)setattr(obj, attr, val):
调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为'bar',则相当于obj.bar= val。
看下面实例:
class Cat(object):
def __init__ ( self ,name= "kityy" ):self .name= name
def sayHi( self ):
print(self.name,"say Hi!")
cat = Cat("kityy")
print(cat.name) #访问实例属性
cat.sayHi() #调用实例方法
if hasattr(cat,"name"): #检查实例是否有这个属性
setattr(cat,"name","tiger") #same as a.name = "tiger"
print(getattr(cat,"name")) #same as print(a.name)
getattr(cat,"sayHi")() #same as :cat.sayHi()
有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的某个字段赋值,而方法名或是字段名在编码代码时并不能确定,需要通过参数传递字符串的形式输入。
这个机制被称为反射(反过来让对象告诉我们他是什么),或是自省(让对象自己告诉我们他是什么),用于实现在运行时获取未知对象的信息。
在一般的编程语言里反射相对其他概念来说稍显复杂,一般来说都是作为高级主题来讲;但在Python中反射非常简单,用起来几乎感觉不到与其他的代码有区别
使用反射获取到的函数和方法可以像平常一样加上括号直接调用,获取到类后可以直接构造实例;不过获取到的字段不能直接赋值,因为拿到的其实是另一个指向同一个地方的引用,赋值只能改变当前的这个引用而已。