python中getattr(),hasattr(),setattr()

    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中反射非常简单,用起来几乎感觉不到与其他的代码有区别

    

    使用反射获取到的函数和方法可以像平常一样加上括号直接调用获取到类后可以直接构造实例不过获取到的字段不能直接赋值,因为拿到的其实是另一个指向同一个地方的引用,赋值只能改变当前的这个引用而已




猜你喜欢

转载自blog.csdn.net/myordry/article/details/80639380