通常,我们操作对象的属性或者方法时,是通过点“.”操作符进行的。例如下面的代码:
class Person: type = "mammal" def __init__(self, name): self.name = name def say_hi(self): print('Hello, my name is', self.name) @staticmethod def feed(): print("Three times per day.") @classmethod def sleep(cls): print("8 hours!") p = Person('Chunming') p.say_hi() print(p.name)
上面代码的输出是:
Hello, my name is Nikhil Nikhil
反射是另外一种操作对象属性和方法的手段,例如:
func = getattr(p, 'say_hi') func() print(getattr(p, "name"))
上面这段代码的输出是:
Hello, my name is Nikhil Nikhil
可见与通过点操作符的结果一致。
1. 反射的四个函数
getattr是获取对象属性或方法的函数,Python的官方文档是这样描述其用法的:
getattr(object, name, value)
返回对象命名属性的值。name必须是字符串。如果该字符串是对象的属性之一,则返回该属性的值。例如, getattr(x, ‘foobar’)等同于 x.foobar。如果指定的属性不存在,且提供了 default值,则返回它,否则触发 AttributeError。
根据文档理解上述代码,getattr(p, ‘say_hi’) 获取了p对象的say_hi属性值并赋值给func变量,因为say_hi属性在Person类中是一个方法,要想调用这个方法, 需要执行func(),getattr(p, “name”) 则是获取p对象的name属性。
除了获取对象属性和方法的getattr函数,python还内置了判断、设置、删除对象属性和方法的函数,来看看Python官方文档对这三个函数的说明:
setattr(object, name, value)
此函数与 getattr() 两相对应。其参数为一个对象、一个字符串和一个任意值。字符串指定一个现有属性或者新增属性。函数会将值赋给该属性,只要对象允许这种操作。例如,setattr(x, ‘foobar’, 123) 等价于 x.foobar = 123。
hasattr(object, name)
该实参是一个对象和一个字符串。如果字符串是对象的属性之一的名称,则返回 True,否则返回 False。(此功能是通过调用 getattr(object, name) 看是否有 AttributeError 异常来实现的。)
delattr(object, name)
setattr() 相关本文来源gao.dai.ma.com搞@代*码(网$的函数。实参是一个对象和一个字符串。该字符串必须是对象的某个属性。如果对象允许,该函数将删除指定的属性。例如 delattr(x, ‘foobar’) 等价于 del x.foobar 。
Python中通过getattr、setattr、hasattr和delattr四个函数操作属性的机制就是反射。是通过字符串的形式操作对象属性和方法的机制。下面对p属性应用setattr、hasattr和delattr这三个函数看看效果:
判断p对象是否有say_bye属性和say_hi属性:
print(hasattr(p, 'say_bye')) # 输出False print(hasattr(p, 'say_hi')) # 输出True